HDP环境下Spark2 SQL无法访问Hive表问题求助
解决Spark Submit集群模式下Hive表找不到的问题
从你遇到的情况来看,明明dl_raw.ACC表在Hive中存在且spark-shell能正常访问,但通过spark-submit以YARN集群模式提交任务时却报表找不到,这大概率是集群环境下Hive元数据配置未正确加载或语法解析问题导致的,下面给你几个针对性的排查和解决方法:
1. 确保集群模式下加载Hive配置文件
spark-shell运行在本地模式时会自动读取客户端的Hive配置(如hive-site.xml),但YARN集群模式下,Executor不会默认获取这些配置,需要手动指定:
- 在
spark-submit命令中添加--files参数,把Hive配置文件打包到任务中:spark-submit --class com.spark.sparkexamples.Audit --master yarn --deploy-mode cluster \ --files /bigdata/datalake/app/config/metadata.csv,/etc/hive/conf/hive-site.xml BRNSAUDIT_v4.jar dl_raw.ACC /bigdatahdfs/landing/AUDIT/BW/2017/02/27/ACC_hash_total_and_count_20170227.dat TH 20170227 - 如果你的HDP集群用Ambari管理,可检查Spark服务的
spark.yarn.dist.files参数是否已包含hive-site.xml,确保集群级配置生效。
2. 修正表名的语法解析问题
从报错信息UnresolvedRelation dl_raw .ACC'*`能看到,表名解析出现了空格和语法错误,可能是代码中表名引用有问题:
- 确保Spark SQL中表名的写法规范:要么直接写
dl_raw.ACC,要么用反引号包裹(如dl_raw.ACC``),避免意外添加空格。检查代码中SQL语句的拼接逻辑,确认没有在表名前后引入多余空格。
3. 验证Spark与Hive版本兼容性
你设置了export SPARK-MAJOR-VERSION=2,需要确认这个Spark版本和HDP集群中的Hive版本是否兼容。HDP有严格的组件兼容矩阵,比如Spark 2.x通常对应Hive 1.2.x或2.x版本,版本不匹配会导致元数据读取失败。可通过spark-submit --version和hive --version确认版本,必要时调整Spark版本参数。
4. 检查集群中Hive元数据的访问权限
本地spark-shell能访问不代表集群Executor有对应权限:
- 确认运行Spark任务的YARN提交用户,是否有读取
dl_raw数据库和ACC表的权限,检查Hive Metastore的访问控制列表。 - 如果集群启用Kerberos认证,需要在
spark-submit中携带正确的票据信息:spark-submit --class com.spark.sparkexamples.Audit --master yarn --deploy-mode cluster \ --principal your-principal@YOUR-REALM.COM --keytab /path/to/your/keytab.keytab \ --files /bigdata/datalake/app/config/metadata.csv BRNSAUDIT_v4.jar dl_raw.ACC /bigdatahdfs/landing/AUDIT/BW/2017/02/27/ACC_hash_total_and_count_20170227.dat TH 20170227
5. 快速测试集群模式的Hive连接
可以先提交一个极简任务验证集群模式下的Hive访问能力:
spark-submit --master yarn --deploy-mode cluster --enable-hive-support -e "select count(*) from dl_raw.ACC"
如果这个任务也失败,说明问题出在集群环境配置而非你的业务代码,可重点排查Hive配置和权限问题。
内容的提问来源于stack exchange,提问作者Vinitkumar
相关产品推荐
相关产品推荐

