背景介绍
Kyuubi是一款Spark Thrift Server的增强版实现,既支持传统的批任务(Batch),也支持 HiveServer2 协议,通过JDBC/ODBC方式接收 Spark SQL请求并执行。企业级应用中常作为统一的SQL Proxy,相比于传统Spark Thrift Server,Kyuubi具备高性能,高可用,易扩展以及更强大的多租户支持,细粒度的权限管理,支持多引擎代理,同时支持SQL与Scale,Kyuubi目前有丰富的工业界落地经验,技术社区活跃。
基本信息
基本架构
Kyuubi与Spark的应用架构主要包括三个关键组件:
- 客户端
- Kyuubi 服务器
- Spark 集群
其交互方式为:客户端通过Batch API或 JDBC/ODBC 等标准SQL连接方式与 Kyuubi 服务器进行交互,Kyuubi 服务器再将请求分发到后端的 Spark 集群中进行并行计算和查询处理。Kyuubi 还通过元数据存储来管理多租户信息和查询会话状态,确保查询的准确性和一致性。
关键特性
Kyubi具备以下五个关键特性, 使其与同类产品相比具备更为明显的优势
- 高性能:高效处理大规模数据集的查询请求,支持横向扩展,保证查询的低延迟和高吞吐率。
- 多租户支持:支持多租户模式,为多个用户和应用程序提供隔离的查询服务,保障安全性和隐私性。
- 高可用性:高可用的部署模式,通过主备架构保证系统的稳定性和可靠性。
- 支持多种数据源:同时查询 Spark 的数据源与其他数据存储系统如 HDFS、Hive 等集成。
- 安全性:基于 Kerberos 的认证和授权与SSL通信传输,确保数据的安全访问。
共享级别
- SERVER模式:类似Spark Thrift Server,Kyuubi Server只会持有一个Spark Engine,即所有的查询都会提交到一个Engine上来跑。
- USER模式:每个用户会使用独立的Engine,能做到用户级别的隔离,这也是更具普适性的一种方式,一方面不希望太浪费资源,每个SQL都起一个Engine,另一方面也希望保持一定的隔离性。
- CONNECTION模式:是指Client每建立一个连接,就创建一个Engine,CONNECTION模式比较适合跑批计算。
应用场景
Kyuubi完全兼容Spark,既适合Batch批任务处理的场景,也适用ad-hoc查询场景,支持SQL与Scala自由切换,支持高可用,扩展性强,支持多引擎代理,还支持接入Flink等其他数据仓库并作为统一的SQL proxy入口;
- 大规模数据分析:处理大规模数据集的查询请求,适用于复杂的数据分析和挖掘任务。
- 实时数据查询:Kyuubi 支持实时查询,通过Spark 快速响应实时数据查询请求。
- 多用户多应用场景:Kyuubi 提供多租户支持,可以为多个用户和应用程序提供隔离的查询服务,适用于多用户多应用的数据分析场景。
- 多数据源查询:Kyuubi 不仅支持Spark 的数据源,还支持 HDFS、Hive 等的集成。
Kyuubi配置
1. kyuubi-defaults.conf
Kyuubi依赖于zookeeper实现集群高可用,安全性方面,本文采用简单的JDBC验证,同时需要建立Kyuubi元数据数据库kyuubi_auth。
# zookeeper高可用配置
kyuubi.ha.addresses=ip
kyuubi.ha.namespace=kyuubi
kyuubi.ha.zookeeper.acl.enabled=true
kyuubi.ha.zookeeper.auth.digest=user:password
# Kyuubi元数据库配置
kyuubi.authentication=JDBC
kyuubi.authentication.jdbc.driver.class = com.mysql.jdbc.Driver
kyuubi.authentication.jdbc.url = jdbc:mysql://host:port/kyuubi_auth
kyuubi.authentication.jdbc.user = user
kyuubi.authentication.jdbc.password = password
kyuubi.authentication.jdbc.query = SELECT 1 FROM auth WHERE user=${user} AND passwd=MD5(CONCAT("SALT",${password}))
# Kyuubi服务配置,支持HTTP协议提交Batch任务,以及支持THRIFT协议实现JDBC查询
kyuubi.frontend.bind.host=0.0.0.0
kyuubi.frontend.bind.port=10019
kyuubi.frontend.rest.bind.host=0.0.0.0
kyuubi.frontend.rest.bind.port=10099
kyuubi.frontend.protocols=THRIFT_BINARY,THRIFT_HTTP,REST
2. kyuubi-env.sh
配置kyuubi与spark集群的环境信息。
export JAVA_HOME=$JAVA_HOME
export SPARK_HOME=$SPARK_HOME
export HADOOP_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
运行测试
使用Kyuubi提供的beeline工具进行测试,建立JDBC连接,并进入到Spark容器中执行SQL。
/apache-kyuubi-1.7.1-bin/bin/beeline -u 'jdbc:kyuubi://host:port/default?kyuubi.engine.type=SPARK_SQL;kyuubi.session.engine.idle.timeout=PT600000M;spark.master=yarn;spark.submit.deployMode=cluster;spark.driver.memory=1g;spark.executor.instances=9;spark.executor.cores=1;spark.executor.memory=4g;spark.default.parallelism=18;spark.sgl.shuffle.partitions=18;spark.yarn.queue=insight;spark.dynamicAllocation.enabled=false' -n user -p pwd