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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示表示 Hadoop 找不到正确的 HDFS 安装路径。你需要检查 Hadoop 配置文件中的 hadoop_hdfs_home 参数是否正确设置,或者确认 HDFS 是否已经正确安装并设置了环境变量。 ### 回答2: Hadoop 是一款大数据处理框架,需要依赖 Hadoop HDFS 存储系统。在配置 Hadoop 环境时,需要设置环境变量 HADOOP_HDFS_HOME,以指定 Hadoop HDFS 的安装路径。当出现 "error: invalid hadoop_hdfs_home" 错误时,意味着系统无法识别该环境变量,即 Hadoop HDFS 安装路径无效。 解决该问题的方法是检查环境变量的设置是否正确。首先在命令行界面输入 echo $HADOOP_HDFS_HOME 命令,以检查系统是否能识别该环境变量。如果该命令无法输出正确的路径,则需要修改环境变量的设置。 可以在 ~/.bashrc 或 ~/.bash_profile 文件中添加以下环境变量设置语句: export HADOOP_HDFS_HOME=/path/to/hadoop-hdfs 其中,/path/to/hadoop-hdfs 是 Hadoop HDFS 的安装路径。设置好这个环境变量之后,可以输入 source ~/.bashrc 或 source ~/.bash_profile 命令,以使环境变量的改动生效。 另外,还可通过设置 Hadoop 的配置文件来修改 Hadoop HDFS 的安装路径。可以在 Hadoop 配置文件 core-site.xml 中添加以下配置: <property> <name>hadoop.hdfs.home</name> <value>/path/to/hadoop-hdfs</value> </property> 在以上配置中,/path/to/hadoop-hdfs 是 Hadoop HDFS 的安装路径。保存好配置文件后,重新启动 Hadoop,即可解决 "error: invalid hadoop_hdfs_home" 错误。 ### 回答3: 这个错误信息意味着在运行hadoop相关命令时,系统无法找到指定的hadoop_hdfs_home环境变量。hadoop_hdfs_home是一个关键的环境变量,用于指定hadoop分布式文件系统(HDFS)的安装目录。如果系统无法找到或者无法识别该环境变量,就会出现invalid错误提示。 要解决这个问题,可以尝试以下步骤: 1.检查hadoop_hdfs_home环境变量是否正确设置,可以通过运行echo $hadoop_hdfs_home命令来确认该环境变量的值是否正确。 2.如果hadoop_hdfs_home环境变量未设置,可以通过手动设置该变量或者运行hadoop-env.sh脚本来设置该变量。 3.如果hadoop_hdfs_home环境变量设置正确,但仍然无法正常运行hadoop相关命令,可以尝试重新安装hadoop,并确保正确配置了环境变量。 4.最后,如果你还是无法解决这个问题,可以查看系统日志文件或运行hadoop日志命令来查找更详细的信息和错误提示,以帮助你进一步解决该问题。 总之,如果出现invalid hadoop_hdfs_home错误提示,需要确认hadoop_hdfs_home环境变量设置是否正确,并根据具体情况采取适当措施,以解决此问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值