通过 Spark thriftserver 操作Hudi表

背景

本篇主要讲解如何配置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.jarhudi-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= \
--hiveconf hive.server2.thrift.bind.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。

参考资料

Spark 官方 Thriftserver 文档

你可能感兴趣的:(通过 Spark thriftserver 操作Hudi表)