Spark3 与hive3集成(spark on hive)

打印 上一主题 下一主题

主题 842|帖子 842|积分 2526

 一、背景
为了让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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表