最近在Spark和Hive的连接调试中又遇到了之前处理过的兼容性的问题,这次索性把解决方案记录上来吧~
问题复现
- 报错内容:
- Exception in thread "main" org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table fieldchanges. Invalid method name: 'get_table_req'
原因剖析
- Spark3.x默认的Hive版本为2.3.7
- 在Spark3.x中对与Hive的select操作调用方法为:
- 而默认支持Hive1.x的Spark2.x中对应方法为:
解决方案
方案一
-
从Spark官网中看到:
- 从Spark 1.4.0开始,使用以下描述的配置,可以使用Spark SQL的单个二进制版本来查询Hive元存储的不同版本。请注意,与用于与metastore进行通信的Hive版本无关,Spark SQL在内部将针对内置Hive进行编译,并将这些类用于内部执行(serdes,UDF,UDAF等)。
-
SparkSQLCLIDriver,或者SparkSQL程序运行前在VM options中添加参数:
-Dspark.master=local[2] -Dspark.sql.hive.metastore.version=1.1.0 -Dspark.sql.hive.metastore.jars=lib/* -Djline.WindowsTerminal.directConsole=false- 注意:spark.sql.hive.metastore.jars路径需要在本地,拷贝服务器hive/lib目录
方案二
-
从Spark3.0.x源码
pom.xml文件发现: -
Spark3.0.x默认支持Hadoop2.7,虽然默认支持Hive2.3,但是可以不改动直接选定Hive1.2
-
在编译中指定:
-Phive-1.2 -Phive-thriftserver -Dhive.version=1.2.1
- 用自己的编译包,一劳永逸~