背景
需要使用spark脚本读写hive数据
又需要让hive mr引擎使用spark,从而从kettle入口触发hive交互时hive能够用到spark性能
版本依赖
原生apache :
hive 2.3.3
spark 2.1.0
spark 2.1.0-without-hadoop
hadoop 2.6.5
问题所在
因为sparksql使用hive仓库需使用到完整的hive,hdfs依赖包,因此需要使用apache预编译好的hadoop整合包,否则无论在spark-shell环境还是spark-submit提交作业都会报出hive类异常之类的错误
Caused by: java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support
Unable to instantiate SparkSession with Hive support because Hive classes are not found
而使用预编译包,在hive中使用spark引擎的话,又会发生
java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
的错误,这个时候需要非预编译hive的spark工程,相当矛盾。
解决方法
利用spark在driver运行节点classpath下获取相关jars的原理,在hive运行节点使用spark-without-hadoop包。而在yarn nodemanager节点使用spark预编译包,sparksql提交的脚本driver也运行于这几个节点。
节点名称 | 节点功能 | 使用部署包 | 运行说明 |
---|---|---|---|
master1 | 主节点 | spark-2.1.0-bin-without-hadoop.tgz hive-2.3.3.tar |
yarn resourcemanager,hive |
master2 | 主节点备用 | spark-2.1.0-bin-without-hadoop.tgz hive-2.3.3.tar |
yarn resourcemanager,hive |
slave1 | 运算节点1 | spark-2.1.0-bin-hadoop2.6.tgz | yarn nodemanager, 使用spark shell/submit |
slave2 | 运算节点2 | spark-2.1.0-bin-hadoop2.6.tgz | yarn nodemanager, 使用spark shell/submit |
slave3 | 运算节点3 | spark-2.1.0-bin-hadoop2.6.tgz | yarn nodemanager, 使用spark shell/submit |