HDP版本3.1.4,Hadoop3.1.4,Spark2.3.2,Scala2.11.x,Hive3.1.0
这个版本本身基于集群操作是没问题的。但是远程操作时挖的坑太大
1.首先据说是spark2.3.2依赖包spark-hive_2.11下的hive-exec.1.2.1.spark2.jar这个包没有对hadoop3.0的支持。
报错信息如下
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.hadoop.hive.conf.HiveConf.<clinit>(HiveConf.java:105)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.util.Utils$.classForName(Utils.scala:239)
at org.apache.spark.sql.SparkSession$.hiveClassesArePresent(SparkSession.scala:1079)
at org.apache.spark.sql.SparkSession$Builder.enableHiveSupport(SparkSession.scala:866)
at scalaittest.sparksql.SparkOnHiveDemo$.main(SparkOnHiveDemo.scala:13)
at scalaittest.sparksql.SparkOnHiveDemo.main(SparkOnHiveDemo.scala)
Caused by: java.lang.IllegalArgumentException: Unrecognized Hadoop major version number: 3.1.4
at org.apache.hadoop.hive.shims.ShimLoader.getMajorVersion(ShimLoader.java:174)
at org.apache.hadoop.hive.shims.ShimLoader.loadShims(ShimLoader.java:139)
at org.apache.hadoop.hive.shims.ShimLoader.getHadoopShims(ShimLoader.java:100)
at org.apache.hadoop.hive.conf.HiveConf$ConfVars.<clinit>(HiveConf.java:368)
... 8 more
报错处理依据这位大佬的方式进行调整
或者自行下载源码,重新编译进去对hadoop3.x的支持分支
window使用spark连接HDP-3.1.5.0时报Unrecognized Hadoop major version number: 3.1.1问题-CSDN博客
创建的properties文件中,添加当前spark的版本
至于为啥!我也不知道!这个地方我是无比懵比的。
而且我也按照大佬讲的设置了,也没有生效,换成我自己的spark版本号就可以用了,也没那么多时间深究,奇怪就先奇怪吧。有了解的可以评论里讲讲,我学习学习
2.有的小伙伴会遇到这个报错
spark hive java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT
原因另外一个大佬有解释
https://www.cnblogs.com/fbiswt/p/11798514.html
3.然后最坑的来了
hive3.x后开始支持ACID,默认是开启的,但是Spark2.x不支持读取ACID表
需要关闭这三个参数,然后重建表
hive.strict.managed.tables | false |
hive.create.as.insert.only | false |
metastore.create.as.acid | false |
参考这个大佬的说法
https://www.cnblogs.com/atrox/p/13579537.html
4.最后一步,还需要设置metastore访问参数
val session: SparkSession = SparkSession.builder() .appName("SparkOnHiveDemo") .master("local") .enableHiveSupport() .config("hive.metastore.uris", "thrift://192.168.100.102:9083") .getOrCreate()
然后就可以读了