前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
前段时间研究了一下Kyuubi,主要是安装配置,适配Spark版本,验证Spark Server HA 的功能,基本都验证通过,但是后续没有实际使用,现在回忆总结一下,避免遗忘。
主要适配Spark2.4.5 以及 Spark3.1.2版本,同时验证是否支持Hudi。
版本说明
目前Kyuubi最新版本为1.4,Kyuubi 1.x 默认不支持Spark2,1.4版本默认Spark版本3.1.2,并且默认支持Hudi,但是因hudi0.9版本不支持Spark3.1.2,所以需要hudi0.10.1
hudi0.10.1 已经发布,可以通过 Mvn 下载:https://repo1.maven.org/maven2/org/apache/hudi/hudi-spark3.1.2-bundle_2.12/0.10.1/hudi-spark3.1.2-bundle_2.12-0.10.1.jar
也可以自己打包
要想支持Spark2可以选择Kyuubi0.7,两个Kyuubi 版本都支持HA,但是0.7版本默认不支持hudi
0.7版本打包: git 切换到branch-0.7
修改pom,添加1
2
3
4
5
6
7<profile>
<id>spark-2.4.5</id>
<properties>
<spark.version>2.4.5</spark.version>
<scalatest.version>3.0.3</scalatest.version>
</properties>
</profile>
然后执行打包命令1
./build/dist --tgz -P spark-2.4.5
打包完成后,生成kyuubi-0.7.0-SNAPSHOT-bin-spark-2.4.5.tar.gz
Kyuubi1.4
下载
下载apache-kyuubi-1.4.0-incubating-bin.tgz
解压
1 | tar -zxvf apache-kyuubi-1.4.0-incubating-bin.tgz -C /opt/ |
这里的路径为 /opt/apache-kyuubi-1.4.0-incubating-bin
验证Spark
首先确保安装的Spark版本为 spark3.1.21
2
3
4
5
6Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.1.2
/_/
测试Hadoop/Spark环境1
2
3
4
5/usr/hdp/3.1.0.0-78/spark3/bin/spark-submit \
--master yarn \
--class org.apache.spark.examples.SparkPi \
/usr/hdp/3.1.0.0-78/spark3/examples/jars/spark-examples_2.12-3.1.2.jar \
10
输出结果
1 | Pi is roughly 3.138211138211138 |
修改Kyuubi配置
1 | cd /opt/apache-kyuubi-1.4.0-incubating-bin/conf/ |
kyuubi-env.sh
1 | cp kyuubi-env.sh.template kyuubi-env.sh |
kyuubi-defaults.conf
1 | cp kyuubi-defaults.conf.template kyuubi-defaults.conf |
配置环境变量
1 | vi ~/.bashrc |
启停Kyuubi
1 | bin/kyuubi start |
端口冲突
引用:放弃Spark Thrift Server吧,你需要的是Apache Kyuubi!
1 | cat logs/kyuubi-root-org.apache.kyuubi.server.KyuubiServer-indata-*.indata.com.out |
发现KyuubiServer报错端口占用,但不知道占用的是哪个端口。看下源码,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18private val zkServer = new EmbeddedZookeeper()
def startServer(conf: KyuubiConf): KyuubiServer = {
if (!ServiceDiscovery.supportServiceDiscovery(conf)) {
zkServer.initialize(conf)
zkServer.start()
conf.set(HA_ZK_QUORUM, zkServer.getConnectString)
conf.set(HA_ZK_ACL_ENABLED, false)
}
val server = new KyuubiServer()
server.initialize(conf)
server.start()
Utils.addShutdownHook(new Runnable {
override def run(): Unit = server.stop()
}, Utils.SERVER_SHUTDOWN_PRIORITY)
server
}
看下源码,如果检测到没有配置服务发现,就会默认使用的是内嵌的ZooKeeper。当前,我们并没有开启HA模式。所以,会启动一个本地的ZK,而我们当前测试环境已经部署了ZK。所以,基于此,我们还是配置好HA。这样,也可以让我们Kyuubi服务更加可靠。
当然其实我们本来就是要配置HA的
配置Kyuubi HA
1 | kyuubi.ha.enabled true |
beeline连接
非HA
首先以非HA,即IP:Port的形式测试连接
这里用spark3 beeline,hive beeline不兼容
1 | /usr/hdp/3.1.0.0-78/spark3/bin/beeline |
这里分别以spark用户和hive用户起了两个程序
HA
HA连接方式是指,通过Zookeeper地址发现的方式,Kyuubi 1.4 zooKeeperNamespace默认值为kyuubi
1 | /usr/hdp/3.1.0.0-78/spark3/bin/beeline |
根据日志,可以看到,我们的jdbc链接地址为zookeeper,通过zookeeper解析zooKeeperNamespace获取到kyuubi server真正的地址为indata-192-168-44-130.indata.com:10009
实际上,当我们配置了HA参数,启动Kyuubi Server时会在zookeeper创建一个地址/kyuubi,让我们来看一下,在zookeeper上存的是什么信息
1 | /usr/hdp/3.1.0.0-78/zookeeper/bin/zkCli.sh -server indata-192-168-44-130.indata.com:2181 |
可以看到,不仅保存了kyuubi server的ip、端口,还保存了kerberos票据等信息。
zooKeeperNamespace默认值为kyuubi,我们可以通过修改配置参数更改它
1 | vi conf/kyuubi-defaults.conf |
重启kyuubi server,在通过zk查看,发现原来的/kyuubi内容为空,新建了一个/kyuubi_cluster001,内容和之前一样。
再另一台机器再起一个kyuubi server,这样才能达到真正的HA效果,再在zk看一下,我们发现,内容已经变成两个kyuubi server了
1 | ls /kyuubi_cluster001 |
查看具体内容,需要以逗号分隔,分开查看,这里就不贴详细信息了
1 | get /kyuubi_cluster001/serviceUri=indata-192-168-44-130.indata.com:10009;version=1.4.0-incubating;sequence=0000000006 |
beeline 多登陆几次,就会发现,会随机选择两个kyuubi server中的一个,这样就做到了HA,主要这里的zooKeeperNamespac改为了kyuubi_cluster0011
2
3
4
5
6
7!connect jdbc:hive2://indata-192-168-44-128.indata.com,indata-192-168-44-129.indata.com,indata-192-168-44-130.indata.com/default;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=kyuubi_cluster001;hive.server2.proxy.user=spark
22/03/23 11:51:43 INFO Utils: Resolved authority: indata-192-168-44-130.indata.com:10009
22/03/23 11:51:43 INFO HiveConnection: Connected to indata-192-168-44-130.indata.com:10009
22/03/23 13:53:19 INFO Utils: Resolved authority: indata-192-168-44-129.indata.com:10009
22/03/23 13:53:19 INFO HiveConnection: Connected to indata-192-168-44-129.indata.com:10009
支持hudi
注意首先配好 spark hudi环境,这里的hudi jar包需要适配spark3.1.2,开头有说明
1 | !connect jdbc:hive2://indata-192-168-44-128.indata.com,indata-192-168-44-129.indata.com,indata-192-168-44-130.indata.com/default;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=kyuubi_cluster001;hive.server2.proxy.user=spark#spark.yarn.queue=default;spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension;spark.serializer=org.apache.spark.serializer.KryoSerializer;spark.executor.instances=1;spark.executor.memory=1g;kyuubi.engine.share.level=CONNECTION |
通过jdbc_url中指定spark的参数
- spark.yarn.queue 队列
- spark.executor.instances executor的数量 默认2
- spark.executor.memory executor的内存大小
- kyuubi.engine.share.level kyuubi的级别,默认user
支持hudi是通过这俩参数:spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension;spark.serializer=org.apache.spark.serializer.KryoSerializer
通过上面的参数连接kyuubi server并启动spark server程序后,验证hudi sql功能
1 | create table test_hudi_table ( |
简单的验证一下hudi的sql没有问题就行
kyuubi 0.7
这里主要是为了适配spark2, 本人的spark2版本为spark2.4.5,前面有说明如何打包kyuubi 0.7,这里打包完后的包名为:kyuubi-0.7.0-SNAPSHOT-bin-spark-2.4.5.tar.gz
配置
1 | tar -zxvf kyuubi-0.7.0-SNAPSHOT-bin-spark-2.4.5.tar.gz -C /opt/ |
解决: No such file or directory
因为tar包是在windows上打的,脚本和Linux不兼容,需要进行修改,解决方法
1 | 用vim打开该sh文件,输入: |
bin 目录下面的脚本都执行一遍
启动Kyuubi Server
1 | bin/start-kyuubi.sh --master yarn --deploy-mode client --driver-memory 2g --conf spark.kyuubi.frontend.bind.port=10010 --conf spark.kyuubi.authentication=KERBEROS --conf spark.kyuubi.ha.enabled=true \ |
beeline连接
IP:Port
1 | !connect jdbc:hive2://indata-192-168-44-130.indata.com:10010/;principal=hive/indata-192-168-44-130.indata.com@INDATA.COM;hive.server2.proxy.user=spark |
ZK
1 | /usr/hdp/3.1.0.0-78/spark2/bin/beeline |
然后我们发现没有连接成功,解析zk地址为null:0,我们在zk客户端,发现zk地址里的内容是正确的,那么就是beeline客户端解析有问题,然后我用Java 连接 Kereros认证下的Spark Thrift Server/Hive Server总结连接发现是成功的,只需要将程序中的SPARK_JDBC_URL 改为 jdbc:hive2://indata-192-168-44-128.indata.com,indata-192-168-44-129.indata.com,indata-192-168-44-130.indata.com/default;principal=hive/indata-192-168-44-130.indata.com@INDATA.COM;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=kyuubi_cluster002,前提pom依赖版本要对应好
这样进一步验证我们的server没有问题,然后我试着将maven仓库中的hive-jdbc-1.2.1.jar
放到 $SPARK_HOME/jars下,然后将原来的hive-jdbc-1.21.2.3.1.0.0-78.jar
做一个备份并删掉
1 | mv hive-jdbc-1.21.2.3.1.0.0-78.jar hive-jdbc-1.21.2.3.1.0.0-78.jar.bak |
1 | /usr/hdp/3.1.0.0-78/spark2/bin/beeline |
然后发现正确解析了zk里面的内容,连接成功!!
当然这里碰巧替换了hive-jdbc-1.2.1.jar就成功了,如果不行的话,可以自己下一个开源的spark2.4.5,然后考一个之前的spark备份,试着将备份中所有的jar包都替换为开源版本,再试着用备份路径下的beeline命令
spark 2.4.5 下载地址:http://archive.apache.org/dist/spark/spark-2.4.5/
程序连接异常
上面的连接串程序运行是正常的,当加了hive.server2.proxy.user=spark时,就会抛出下面的异常
1 | org.apache.hive.service.cli.HiveSQLException: Failed to validate proxy privilege of hive for spark |
这是因为我本地机器没有权限
修改core-site.xml
1 | hadoop.proxyuser.hive.groups=* |
然后重启HDFS服务,再重新运行程序就可以了
当然我这里启动Kyuubi使用的票据为hive用户,就需要修改hive的权限;还有在生产环境不要设置权限为*
HA
在另一台服务器上,配置相同的kyuubi,并启动,1
bin/start-kyuubi.sh --master yarn --deploy-mode client --driver-memory 2g --conf spark.kyuubi.frontend.bind.port=10010 --conf spark.kyuubi.authentication=KERBEROS --conf spark.kyuubi.ha.enabled=true --conf spark.kyuubi.ha.zk.quorum=indata-192-168-44-128.indata.com,indata-192-168-44-129.indata.com,indata-192-168-44-130.indata.com --conf spark.kyuubi.ha.zk.namespace=kyuubi_cluster002 --conf spark.kyuubi.ha.mode=load-balance --conf spark.kyuubi.frontend.bind.host=indata-192-168-44-129.indata.com --conf spark.yarn.keytab=/etc/security/keytabs/hive.service.keytab --conf spark.yarn.principal=hive/indata-192-168-44-129.indata.com@INDATA.COM
然后beeline重新多次连接后,会发现当用这台服务器的principal连接连接另外一台服务器的kyuubi server时,会报kerberos认证的错误,我们只需要将jdbc连接串中的principal改为hive/_HOST@INDATA.COM,就可以成功随机连接其中的一台Kyuubi server了,但是在Kyuubi 1.4 Spark 3.1.2没有这个问题1
!connect jdbc:hive2://indata-192-168-44-128.indata.com,indata-192-168-44-129.indata.com,indata-192-168-44-130.indata.com/default;principal=hive/_HOST@INDATA.COM;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=kyuubi_cluster002;hive.server2.proxy.user=hive
停止
1 | bin/stop-kyuubi.sh |
参考
放弃Spark Thrift Server吧,你需要的是Apache Kyuubi!
Apache Kyuubi(Incubating) 核心功能调研