Kerberos环境下Spark集群模式读取Hive-HBase表异常问题
我之前在HDP集群的Kerberos环境里遇到过几乎一模一样的问题!咱们一步步来排查解决:
核心问题分析
Local模式下Spark直接复用当前终端的Kerberos凭证和本地配置,但YARN模式(尤其是cluster)的Driver/Executor运行在集群节点上,会面临Kerberos凭证传递、类路径依赖、配置文件同步三大核心问题,这也是和Local模式的本质区别。
针对性解决方案
1. 确保Kerberos凭证在YARN集群中有效传递
Local模式用的是当前用户的Kerberos ticket,但YARN集群的Driver/Executor需要独立的凭证:
- 在
spark-submit中添加Kerberos认证参数:--keytab /path/to/your/user.keytab \ --principal your_user_principal@YOUR_REALM.COM \ - 开启Spark自动获取HBase Kerberos凭证的配置:
--conf spark.yarn.security.credentials.hbase.enabled=true
2. 解决YARN模式下的类路径依赖冲突
你手动传入了部分JAR,但YARN的默认类路径可能覆盖你的依赖,导致版本不兼容或类缺失:
- 补充完整HBase相关依赖JAR,不能只传
hive-hbase-handler,还要包含HBase客户端、common、server以及完整的datanucleus系列JAR - 强制指定Driver和Executor的类路径,避免依赖被集群默认路径覆盖:
--driver-class-path /usr/hdp/current/hive-client/lib/hive-hbase-handler-1.2.1000.2.5.3.16-1.jar:/usr/hdp/current/spark-client/lib/datanucleus-api-jdo-3.2.6.jar:/usr/hdp/current/spark-client/lib/datanucleus-core-3.2.10.jar:/usr/hdp/current/spark-client/lib/datanucleus-rdbms-3.2.9.jar:/usr/hdp/current/hbase-client/lib/hbase-client-1.1.2.2.5.3.16-1.jar:... - 建议将所有依赖JAR用逗号分隔完整传入
--jars参数,确保Executor能拿到所有依赖
3. 同步HBase配置文件到YARN集群
Local模式会自动读取本地的hbase-site.xml,但YARN模式下需要手动传递配置:
- 用
--files参数将HBase配置文件传到所有节点:--files /etc/hbase/conf/hbase-site.xml - 同时确保Spark的配置中包含HBase配置路径,避免找不到ZooKeeper地址等关键配置
4. 版本兼容性检查
HDP集群的组件版本是强绑定的,必须确保:
hive-hbase-handler版本和集群Hive、HBase版本完全一致(你用的1.2.1000.2.5.3.16-1是匹配HDP2.5的)- datanucleus的三个JAR(api-jdo、core、rdbms)版本必须和Spark、Hive兼容,不能混用不同版本
5. 日志定位具体报错
如果以上配置还是不行,一定要看YARN的日志:
- Cluster模式:查看Application Master日志,命令:
yarn logs -applicationId <你的APP_ID> - Client模式:查看本地Driver日志
- 重点找
ClassNotFoundException、AuthenticationException这类具体报错,能快速定位缺失的依赖或认证问题
示例完整spark-submit命令
spark-submit \ --master yarn \ --deploy-mode cluster \ --keytab /home/puneet/puneet.keytab \ --principal puneet@EXAMPLE.COM \ --conf spark.yarn.security.credentials.hbase.enabled=true \ --files /etc/hbase/conf/hbase-site.xml \ --jars /usr/hdp/current/hive-client/lib/hive-hbase-handler-1.2.1000.2.5.3.16-1.jar,/usr/hdp/current/spark-client/lib/datanucleus-api-jdo-3.2.6.jar,/usr/hdp/current/spark-client/lib/datanucleus-core-3.2.10.jar,/usr/hdp/current/spark-client/lib/datanucleus-rdbms-3.2.9.jar,/usr/hdp/current/hbase-client/lib/hbase-client-1.1.2.2.5.3.16-1.jar,/usr/hdp/current/hbase-client/lib/hbase-common-1.1.2.2.5.3.16-1.jar,/usr/hdp/current/hbase-client/lib/hbase-server-1.1.2.2.5.3.16-1.jar \ --driver-class-path /usr/hdp/current/hive-client/lib/hive-hbase-handler-1.2.1000.2.5.3.16-1.jar:/usr/hdp/current/spark-client/lib/datanucleus-api-jdo-3.2.6.jar:/usr/hdp/current/spark-client/lib/datanucleus-core-3.2.10.jar:/usr/hdp/current/spark-client/lib/datanucleus-rdbms-3.2.9.jar:/usr/hdp/current/hbase-client/lib/hbase-client-1.1.2.2.5.3.16-1.jar:/usr/hdp/current/hbase-client/lib/hbase-common-1.1.2.2.5.3.16-1.jar:/usr/hdp/current/hbase-client/lib/hbase-server-1.1.2.2.5.3.16-1.jar \ --class com.your.package.YourSparkJob \ your-spark-job.jar
内容的提问来源于stack exchange,提问作者Puneet Babbar
相关产品推荐
相关产品推荐

