Spark连接远程Hive可查看数据库但无法读取表该如何解决?
问题现象
我无法读取使用Spark连接的远程Hive表,但可以正常查看数据库列表。
初始化SparkSession代码如下:
val spark = SparkSession .builder() .config("spark.master", "local") .appName("interfacing spark sql to hive metastore without configuration file") .config("hive.metastore.uris", "thrift://3.96.56.4:9083") // replace with your hivemetastore service's thrift url .config("spark.sql.warehouse.dir", "/apps/hive/warehouse") .enableHiveSupport() // don't forget to enable hive support .getOrCreate()
查询数据库可以正常返回结果:
spark.sql("show databases").show() +---------+ |namespace| +---------+ | default| | test| +---------+
首次查询表报错:
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table student_data. Invalid method name: 'get_table_req'
调整版本适配后查询表出现新报错:
java.net.UnknownHostException
解决方法
针对Invalid method name: 'get_table_req'报错
这个错误是Spark内置Hive客户端版本和远程Hive服务版本不兼容导致的,get_table_req是Hive 2.3及以上版本才支持的API,如果你的远程Hive版本低于2.3,高版本Spark内置的Hive客户端调用这个不存在的API就会报错。
你需要添加两个配置项指定和远程Hive匹配的metastore版本:
- 先确认远程Hive服务的实际版本,比如远程是Hive 1.2.1,就添加如下配置:
.config("spark.sql.hive.metastore.version", "1.2.1") // 让Spark自动拉取对应版本的metastore依赖,也可以指定本地依赖包路径 .config("spark.sql.hive.metastore.jars", "maven")
针对java.net.UnknownHostException报错
这个错误是因为Hive表的元数据中存储的是HDFS节点的主机名,你本地运行Spark的环境没有配置对应主机名的映射,无法解析为IP地址。有三种解决方式:
- 将远程Hadoop集群的
core-site.xml和hdfs-site.xml放到Spark项目的resources目录下,Spark会自动读取HDFS的配置信息 - 在本地
/etc/hosts文件中添加所有远程HDFS节点的IP和主机名映射,比如:3.96.xx.xx nn01 hadoop-namenode - 直接在SparkSession配置中指定HDFS默认文件系统地址:
.config("spark.hadoop.fs.defaultFS", "hdfs://<你的NameNodeIP>:8020")
额外注意事项
- 确保本地机器可以正常访问远程Hive metastore的9083端口、HDFS的8020、50010等必要端口,防火墙要添加对应白名单
- 如果查询的是分区表,要确认分区对应的HDFS路径可以正常访问
内容的提问来源于stack exchange,提问作者Roxane Felton
相关产品推荐
相关产品推荐

