
# 为什么提交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 |
     
  
 
