更新时间:2022-09-30 GMT+08:00

为什么提交Spark Streaming应用超过token有效期,应用失败

问题

修改kerberos的票据和HDFS token过期时间为5分钟,设置“dfs.namenode.delegation.token.renew-interval”小于60秒,提交Spark Streaming应用,超过token有效期,提示以下错误,应用失败。

token (HDFS_DELEGATION_TOKEN token 17410 for spark2x) is expired

回答

  • 问题原因:

    ApplicationMaster进程中有1个Credential Refresh Thread会根据token renew周期 * 0.75的时间比例上传更新后的Credential文件到HDFS上。

    Executor进程中有1个Credential Refresh Thread会根据token renew周期 *0.8的时间比例去HDFS上获取更新后的Credential文件,用来刷新UserGroupInformation中的token,避免token失效。

    当Executor进程的Credential Refresh Thread发现当前时间已经超过Credential文件更新时间(即token renew周期 *0.8)时,会等待1分钟再去HDFS上面获取最新的Credential文件,以确保AM端已经将更新后的Credential文件放到HDFS上。

    “dfs.namenode.delegation.token.renew-interval”配置值小于60秒,Executor进程起来时发现当前时间已经超过Credential文件更新时间,等待1分钟再去HDFS上面获取最新的Credential文件,而此时token已经失效,task运行失败,然后在其他Executor上重试,由于重试时间都是在1分钟内完成,所以task在其他Executor上也运行失败,导致运行失败的Executor加入到黑名单,没有可用的Executor,应用退出。

  • 修改方案:

    在Spark使用场景下,需设置“dfs.namenode.delegation.token.renew-interval”大于80秒。“dfs.namenode.delegation.token.renew-interval”参数描述请参表1考。

    表1 参数说明

    参数

    描述

    默认值

    dfs.namenode.delegation.token.renew-interval

    该参数为服务器端参数,设置token renew的时间间隔,单位为毫秒。

    86400000