Spark3.x调试Hive1.x兼容性问题解决

976 阅读1分钟

最近在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'

image.png

原因剖析

  • Spark3.x默认的Hive版本为2.3.7
  • 在Spark3.x中对与Hive的select操作调用方法为: 40verride.png
  • 而默认支持Hive1.x的Spark2.x中对应方法为: @Override.png

解决方案

方案一

  • 从Spark官网中看到: Interacting with Different Versions of Hive Metastore.png

    • 从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目录

image.png

方案二

  • 从Spark3.0.x源码pom.xml文件发现: - Default hadoop profile. Uses global properties.png chive.grouporg.spark-project.hivehive. group.png scala.version2.12.10scala.version.png

  • Spark3.0.x默认支持Hadoop2.7,虽然默认支持Hive2.3,但是可以不改动直接选定Hive1.2

  • 在编译中指定:-Phive-1.2 -Phive-thriftserver -Dhive.version=1.2.1

image.png

  • 用自己的编译包,一劳永逸~