溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HDFS客戶端讀寫超時時間的示例分析

發(fā)布時間:2021-12-09 11:13:50 來源:億速云 閱讀:286 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下HDFS客戶端讀寫超時時間的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

背景

前段時間我們Hadoop集群磁盤使用率比較高,部分硬盤空間使用超過了70%,這部分服務器DataNode服務讀寫負載就比較高,造成部分數(shù)據(jù)同步任務因為讀寫超時而失敗。具體場景和異常跟這篇博客里描述的很像。

DFSClient客戶端與HDFS交互進行數(shù)據(jù)讀寫,需要從NameNode拿到元數(shù)據(jù)信息,再和DataNode交互,因此,超時時間也同時涉及這兩個服務。以下分別是客戶端與這兩個服務交互的超時時間的解析。

客戶端與NameNode超時時間

客戶端與NameNode的操作超時時間由以下兩個配置控制:

  • ipc.client.ping:默認值是true。當配置為true時,客戶端會盡力等待服務端響應,定期發(fā)送ping消息,使得連接不會因為tcp timeout而斷開。當配置為false時,客戶端會使用配置項ipc.ping.interval對應的值,作為timeout時間,在該時間內(nèi)沒有得到響應,即會超時。

  • ipc.ping.interval:以毫秒為單位,默認值是1分鐘。當ipc.client.ping配置為true時,表示發(fā)送ping消息的周期。當ipc.client.ping設置為false時,表示連接的超時時間。

NameNode節(jié)點處于滿負載、NameNode所在節(jié)點的CPU 100%耗盡時,導致NameNode無法響應,對于新連接到該NameNodeHDFS客戶端,能夠主備切換連接到另一個NameNode,進行正常的操作,而對于已經(jīng)連接到該NameNode節(jié)點的HDFS客戶端可能會卡住,無法進行下一步操作。

HDFS客戶端到NameNodeRPC連接存在keep alive機制,保持連接不會超時,盡力等待服務器的響應,因此導致已經(jīng)連接的HDFS客戶端的操作會卡住。

對于已經(jīng)卡住的HDFS客戶端,可以進行如下操作:

  • 等待NameNode響應,一旦NameNode所在節(jié)點的CPU利用率回落,NameNode可以重新獲得CPU資源時,HDFS客戶端即可得到響應。

  • 如果無法等待更長時間,需要重啟HDFS客戶端所在的應用程序進程,使得HDFS客戶端重新連接空閑的NameNode

為了避免該問題出現(xiàn),在上述問題場景下,可以在客戶端的配置文件core-site.xml中做如下配置:

  • ipc.client.ping配置為false,讓客戶端會使用配置項ipc.ping.interval對應的值,作為timeout時間,在該時間內(nèi)沒有得到響應,即會超時

  • ipc.ping.interval配置一個較大的超時時間,避免服務繁忙時的超時,建議配置為900000,單位為ms

客戶端與DataNode讀寫超時時間

DataNode的讀寫超時時間由以下兩個配置控制:

  • 讀超時時間:dfs.client.socket-timeout。默認值1分鐘。

  • 寫超時時間:dfs.datanode.socket.write.timeout。默認8分鐘。

以上配置是在HDFS客戶端進行設置,它們的默認值在org.apache.hadoop.hdfs.server.common.HdfsServerConstants類里:

// Timeouts for communicating with DataNode for streaming writes/reads
  // DataNode讀寫超時時間
  public static final int READ_TIMEOUT = 60 * 1000;
  public static final int READ_TIMEOUT_EXTENSION = 5 * 1000;
  public static final int WRITE_TIMEOUT = 8 * 60 * 1000;
  public static final int WRITE_TIMEOUT_EXTENSION = 5 * 1000; //for write pipeline

DataNode讀寫超時的時間是跟DataNode的數(shù)量有關(guān)的,最終是根據(jù)DataNode的數(shù)量確定讀寫超時時間,計算方式是以讀寫超時時間的值乘以節(jié)點的數(shù)量,邏輯在org.apache.hadoop.hdfs.DFSClient類里:

/**
 * Return the timeout that clients should use when writing to datanodes.
 * @param numNodes the number of nodes in the pipeline. 管道中節(jié)點的數(shù)量
 */
int getDatanodeWriteTimeout(int numNodes) {
  return (dfsClientConf.confTime > 0) ?
    (dfsClientConf.confTime + HdfsServerConstants.WRITE_TIMEOUT_EXTENSION * numNodes) : 0;
}

int getDatanodeReadTimeout(int numNodes) {
  return dfsClientConf.socketTimeout > 0 ?
      (HdfsServerConstants.READ_TIMEOUT_EXTENSION * numNodes +
          dfsClientConf.socketTimeout) : 0;
}

以上是“HDFS客戶端讀寫超時時間的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI