sparkThriftserver 運行壹天後,有人反饋查詢報錯,我自己測試了下,確實如此
這裏學了下HDFS_DELEGATION_TOKEN 相關的知識,然後做出解答
在上述 /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 為了解決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會慢慢過期失效。
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。
所以造成了失效的情況
通過spark.hadoop.fs.hdfs.impl.disable.cache=true 配置來禁用緩存,拿到最新DFSClient來更新namenode token。這樣就不會有這個問題了。
相關