sparkThriftserver 长时间运行HDFS_DELEGATION_TOKEN失效问题

参考资料:https://github.com/apache/spark/pull/9168

1、背景

sparkThriftserver 运行一天后,有人反馈查询报错,我自己测试了下,确实如此

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.token.SecretManager$InvalidToken): token (HDFS_DELEGATION_TOKEN token 93611 for hadoop) can’t be found in cache

这里学了下HDFS_DELEGATION_TOKEN 相关的知识,然后做出解答

2、问题原因解析

在上述https://github.com/apache/spark/pull/9168中,我将问题原因简单解释下。
在hadoop HA模式下,有三种tokens
1、ha token
2、namenode1 token
3、namenode2 token
Spark通过调用UserGroupInformation.getCurrentUser.addCredentials(tempCreds)来更新ha令牌,HAUtil.cloneDelegationTokenForLogicalUri会将ha令牌复制到namenode令牌。

spark 所做的操作

1、原理

spark 为了解决DT失效问题,加了两个参数”–keytab”和”–principal”,分别指定用于kerberos登录的keytab文件和principal。

–keytab参数指定一个keytab文件,Spark会根据–keytab指定的Kerberos认证文件生成 HDFS Token,然后再将生成的Token信息放到HDFS的某一个目录中供Executor和Driver使用。

Spark ApplicationMaster在Delegation Token将要失效的时候(75% of the renewal interval) 会通过Keytab文件重新认证并获取一个新的Delegation Token,然后将新的Delegation Token写入到指定的HDFS文件中;
Spark Executor在Delegation Token将要失效的时候(80% of the validity)读取HDFS上的最新的Delegation Token文件,然后更新自己的Delegation Token;
理论上这样就能解决掉Token过期的问题,然而在配置了HA的Hadoop集群上2.9.0之前的版本依然存在问题,问题在于配置了HA的Hadoop集群中,Executor读取新的Token信息之后只更新的HDFS的逻辑地址,而未同步更新真正的HDFS Namenode URI对应的Token,从而导致Namenode URI下面的Token会慢慢过期失效。

2、详情

1、Spark AM将获得HDFS Delegation Token(称为hatoken)并将其添加到当前用户的凭证中。
“ha-hdfs:hadoop-namenode” -> “Kind: HDFS_DELEGATION_TOKEN, Service: ha-hdfs:hadoop-namenode, Ident: (HDFS_DELEGATION_TOKEN token 328709 for test)”.

2、DFSClient将为每个NameNode生成另外2个令牌(namenode Token)。
“ha-hdfs://xxx.xxx.xxx.xxx:8020” -> “Kind: HDFS_DELEGATION_TOKEN, Service: xxx.xxx.xxx.xxx:8020, Ident: (HDFS_DELEGATION_TOKEN token 328709 for test)”
“ha-hdfs://yyy:yyy:yyy:yyy:8020” -> “Kind: HDFS_DELEGATION_TOKEN, Service: yyy:yyy:yyy:yyy:8020, Ident: (HDFS_DELEGATION_TOKEN token 328709 for test)”

3、当Spark更新ha token时,DFSClient不会自动生成namenode token。
DFSClient将仅使用namenode token和2个Namenode通信。

4 FileSystem具有缓存,调用FileSystem.get将获得一个缓存的DFSClient,该缓存具有旧的namenode token。
Spark仅更新ha令牌,但DFSClient将使用namenode token。

所以造成了失效的情况

3、解决

通过spark.hadoop.fs.hdfs.impl.disable.cache=true 配置来禁用缓存,拿到最新DFSClient来更新namenode token。这样就不会有这个问题了。

相关

关于hadoop的token的学习参考资料:
https://blog.cloudera.com/hadoop-delegation-tokens-explained/#comment-83166

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值