Spark Streaming关联Hive表时出现认证异常问题求助
Spark Streaming关联Hive表出现GSS认证异常的解决方案
我之前踩过类似的Spark Streaming+Hive关联的认证坑,结合你描述的“先警告后转为GSSException错误”的情况,大概率是单例HiveContext持有的Kerberos认证票据过期导致的——毕竟Spark Streaming是长时运行任务,单例初始化的HiveContext不会自动刷新认证会话,几天票据过期后就会触发认证失败。
下面是具体的排查和解决办法:
一、放弃单例HiveContext,改用批次内初始化SparkSession
单例模式虽然能减少重复初始化开销,但在长时流任务里会导致认证会话无法更新。建议在每个微批的foreachRDD中初始化支持Hive的SparkSession:
streamingDStream.foreachRDD { rdd => // 基于当前RDD的SparkContext配置创建SparkSession val spark = SparkSession.builder() .config(rdd.sparkContext.getConf) .enableHiveSupport() .getOrCreate() import spark.implicits._ // 在这里关联Hive表并处理流数据 val hiveDeviceTable = spark.table("iot.db.iotdevice") // 流数据与Hive表的关联逻辑... }
这样每次处理批次时,SparkSession会自动处理认证刷新,避免票据过期问题。
二、配置Kerberos票据自动刷新
确保你的Spark任务配置了Kerberos自动刷新相关参数,可在spark-defaults.conf或者spark-submit命令中添加:
# 基础Kerberos认证配置 spark.hadoop.security.authentication=kerberos spark.hadoop.security.authorization=true # YARN层面的主体和keytab配置 spark.yarn.principal=your-spark-principal@YOUR-REALM.COM spark.yarn.keytab=/path/to/your/spark.keytab # Hive元数据服务的Kerberos配置 spark.hadoop.hive.metastore.kerberos.authentication.enabled=true spark.hadoop.hive.metastore.principal=hive-metastore/_HOST@YOUR-REALM.COM
这些配置会让Spark自动在票据过期前刷新认证会话。
三、排查HDFS与Hive表的权限问题
从日志里的ParquetInputSplit信息来看,任务是在访问HDFS上的Parquet文件时出错,别忘了检查:
- 运行Spark任务的Kerberos主体,对
hdfs://nameservice1/user/hive/warehouse/iot.db/iotdevice/路径下的文件有读权限 - Hive表的元数据权限是否正常,可通过
hive> SHOW GRANTS FOR your-principal;查看
额外排查步骤
- 用
klist命令在Spark任务运行的节点上查看Kerberos票据的过期时间,确认是否刚好在报错前过期 - 检查Hive Metastore的日志,看是否有元数据服务的认证失败记录,有时候问题根源在Metastore而非HDFS访问
内容的提问来源于stack exchange,提问作者Kishore
相关产品推荐
相关产品推荐

