當前位置:編程學習大全網 - 源碼下載 - sparkThriftserver 長時間運行HDFS_DELEGATION_TOKEN失效問題

sparkThriftserver 長時間運行HDFS_DELEGATION_TOKEN失效問題

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。這樣就不會有這個問題了。

相關

  • 上一篇:c語言連接通不過:LNK2001和LNK1120錯誤,搞了好久,能力局限,沒法解決,只好請各位大蝦幫忙了!
  • 下一篇:壹個頁面有2組checkbox復選框,如何用JS實現對這2組分別全選、反選、全不選?
  • copyright 2024編程學習大全網