背景
本篇主要讲解如何配置Spark thriftserver,从而可以使用JDBC方式通过Spark thriftserver操作Hudi表。
博主的环境信息:
- Spark 3.1.1
- Hive 3.1.0
- Hadoop 3.1.1
- Hudi 0.11.1
环境准备
首先,我们需要编译Hudi。然后找到编译后输出的hudi-spark3.1-bundle_2.12-0.11.1.jar
和hudi-hadoop-mr-bundle-0.11.1.jar
,复制到$SPARK_HOME/jars
中。
找一台已经安装了maven的服务器。执行:
git clone https://github.com/apache/hudi.git
源代码clone成功之后,切换分支到origin/release-0.11.1
。接着执行编译命令(Scala版本和Spark版本需要和实际使用的Spark一致):
mvn clean package -Dspark3.1 -Dscala2.12 -DskipTests -T 4
编译输出产物位于hudi/packaging/
中。
接下来集成Hive配置。如果Spark还没有集成Hive metastore配置的话,需要将hive-site.xml
复制到$SPARK_HOME/conf
目录中。
最后使用如下命令启动Spark thriftserver:
$SPARK_HOME/sbin/start-thriftserver.sh \
--jars /path/to/hudi-spark3.1-bundle_2.12-0.11.1.jar \
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension \
--hiveconf hive.aux.jars.path=/path/to/hudi-hadoop-mr-bundle-0.11.1.jar \
--hiveconf hive.metastore.schema.verification=false \
--hiveconf datanucleus.schema.autoCreateAll=true
--jars /path/to/hudi-spark3.1-bundle_2.12-0.11.1.jar
和--hiveconf hive.aux.jars.path=/path/to/hudi-hadoop-mr-bundle-0.11.1.jar
需要替换为jar包真实存放路径。前面将这两个jar放置到了$SPARK_HOME/jars
中,可以不添加这两个配置。
以上配置是根据本人在GitHub上的提问[SUPPORT] Cannot create table via Spark thrift server · Issue #6185 · apache/hudi (github.com)的解答得知。Thriftserver的这些启动参数不全是必需的。实测时候不可缺少的参数是这两个:
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension \
执行后有如下提示信息:
starting org.apache.spark.sql.hive.thriftserver.HiveThriftServer2, logging to /var/log/spark3/spark-hdfs-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-xxx.out
根据提示,我们可以查看启动时候的日志文件:
tail -f /var/log/spark3/spark-hdfs-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-xxx.out
如果没有报错,说明启动成功。
最常见的错误为没有权限访问HDFS。需要配置启动Spark thriftserver用户访问HDFS的权限(通过Ranger),或者换一个有权限的用户启动thriftserver。
如果需要修改thriftserver的端口号和bind host,可以在启动thriftserver的命令行添加如下配置:
--hiveconf hive.server2.thrift.port=<listening-port> \ --hiveconf hive.server2.thrift.bind.host=<listening-host> \
验证
$SPARK_HOME/bin/beeline --hiveconf hive.input.format=org.apache.hudi.hadoop.HoodieParquetInputFormat -u jdbc:hive2://thriftserver-ip:10000/default
注意:jdbc连接字符串中的thriftserver-ip
为thriftserver所在机器的IP或hostname,后面的10000为端口号。使用的时候需要替换为真实值。
进入beeline命令行后可以执行建表,插入数据和查询语句。可以正常操作Hudi表。
附录
如果使用了Ambari管理Spark thriftserver,为了修改启动参数,可以自定义spark3-thrift-server-conf
配置项,增加:
- spark.serializer=org.apache.spark.serializer.KryoSerializer
- spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension
两个自定义配置。然后重启Spark thriftserver。
网友评论