一、背景
为了让Spark可以或许访问Hive,必须为Spark添加Hive支持。Spark官方提供的预编译版本,通常是不包含Hive支持的,必要采用源码编译,编译得到一个包含Hive支持的Spark版本,同时,spark 默认通过yarn举行资源管理。
二、编译
Apache Maven: 3.9.6
Scala: 2.12.18
jdk: oracle jdk 1.8.0_251
Apache Spark: 3.5.2
Apache Hive: 3.1.3
OS platform: centos7
1,设置maven内存(原有设置较小,轻易OOM)
vi /opt/spark-3.3.1/dev/make-distribution.sh
export MAVEN_OPTS="${MAVEN_OPTS:--Xmx4g -XX:ReservedCodeCacheSize=2g -XX:MaxDirectMemorySize=256m}"
MVN="/opt/softwear/apache-maven-3.6.3/bin/mvn"
|
2,指定hadoop,spark版本:修改dev/make-distribution.sh脚本
添加如下
# spark版本
VERSION=3.5.2
# scala版本
SCALA_VERSION=2.12
# hadoop版本
SPARK_HADOOP_VERSION=3.3.6
# 开启hive
SPARK_HIVE=1
表明如下:
#VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ \
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | tail -n 1)
#SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version $@ \
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | tail -n 1)
#SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version $@ \
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | tail -n 1)
#SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@ \
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | fgrep --count "<id>hive</id>";\
# # Reset exit status to 0, otherwise the script stops here if the last grep finds nothing\
# # because we use "set -o pipefail"
# echo -n)
|
3,编译打包:
/opt/spark-3.5.2/dev/make-distribution.sh --name 3.5.2 --tgz -Pyarn -Phive -Phive-thriftserver -Dhadoop.version=3.3.6 -DskipTests
| 4,最终编译二进制包 位于 主目录下:spark-3.5.2-bin-3.5.2.tgz
二、部署验证
1,直接使用spark-shell 与 hive交互,在执行官网 load 语句时候报错
sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")
|
执行spark sql 报错:
org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.thrift.transport.TTransportException
hive日志报错:metastore.RetryingHMSHandler: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
|
直接在 spark-shell 与hive交互报错分析:由于 spark3.5.2 默认支持的是 hive2.3.9, 而该环境使用的是 hive 3.1.3, 怀疑为hive版本跨度大,版本不兼容导致,目前看到hive jira表现 hive2.x存在bug:https://issues.apache.org/jira/browse/HIVE-15642?jql=project%20%3D%20HIVE%20AND%20status%20%3D%20Closed%20AND%20text%20~%20%22Replicate%22%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC, 该bug在hive3.0修复
2,参考 使用spark毗连不同版本 hive metastore:
Hive Tables - Spark 3.5.2 Documentation 举行配置
# 指定提交到 yarn 运行
spark.master yarn
# 开启日志并存储到 HDFS 上
spark.eventLog.enabled true
spark.eventLog.dir hdfs://nameservice1/spark-logDir
# 指定每个执行器的内存
spark.executor.memory 1g
# 指定每个调度器的内存
spark.driver.memory 1g
spark.history.fs.logDirectory hdfs://nameservice1/spark-logDir
spark.yarn.historyServer.address {spark-history-server IP}:18080
spark.history.ui.port 18080
# 需提前上传到 hdfs上
spark.yarn.jars hdfs://nameservice1/spark-jars/*.jar
spark.sql.hive.metastore.version 3.1.3
spark.sql.hive.metastore.jars path
# 需将jars上传到 yarn 每个nodemanager节点对应目录下
spark.sql.hive.metastore.jars.path file:///opt/hive/apache-hive-3.1.3-bin/lib/*.jar
|
说明:
若不将 hive安装目录复制到yarn nodemanager节点上,则 执行spark-sql与 hive交互报错:
CREATE TABLE IF NOT EXISTS test.test_1202 (name string, age int)
org.apache.spark.sql.AnalysisException: java.lang.ExceptionInInitializerError: null ,
Caused by: java.lang.IllegalArgumentException: URI scheme is not "file"
at java.io.File.<init>(File.java:421)
at org.apache.hadoop.hive.conf.HiveConf.findConfigFile(HiveConf.java:179)
at org.apache.hadoop.hive.conf.HiveConf.<clinit>(HiveConf.java:146)
|
由于 spark on yarn ,即 位于yarn nodemanagert节点上的hive客户端 未配置 hive-site.xml 位置,故无法找到 该配置文件;同时,查看 HiveConf.java 中的 findConfigFile 方法 发现必要环境变量 HIVE_CONF_DIR, HIVE_HOME,故将 hive安装包复制到 yarn nodemanager节点,并配置 全局变量 HIVE_CONF_DIR, HIVE_HOME
至此,spark 3与 hive3集成完成
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |