背景
本篇主要講解如何配置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。