您好,登錄后才能下訂單哦!
小編給大家分享一下HDFS客戶端讀寫超時時間的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
前段時間我們Hadoop
集群磁盤使用率比較高,部分硬盤空間使用超過了70%
,這部分服務器的DataNode
服務讀寫負載就比較高,造成部分數據同步任務因為讀寫超時而失敗。具體場景和異常跟這篇博客里描述的很像。
DFSClient
客戶端與HDFS
交互進行數據讀寫,需要從NameNode
拿到元數據信息,再和DataNode
交互,因此,超時時間也同時涉及這兩個服務。以下分別是客戶端與這兩個服務交互的超時時間的解析。
客戶端與NameNode
的操作超時時間由以下兩個配置控制:
ipc.client.ping
:默認值是true
。當配置為true
時,客戶端會盡力等待服務端響應,定期發送ping
消息,使得連接不會因為tcp timeout
而斷開。當配置為false
時,客戶端會使用配置項ipc.ping.interval
對應的值,作為timeout
時間,在該時間內沒有得到響應,即會超時。
ipc.ping.interval
:以毫秒為單位,默認值是1分鐘。當ipc.client.ping
配置為true
時,表示發送ping
消息的周期。當ipc.client.ping
設置為false
時,表示連接的超時時間。
當NameNode
節點處于滿負載、NameNode
所在節點的CPU
100%
耗盡時,導致NameNode
無法響應,對于新連接到該NameNode
的HDFS
客戶端,能夠主備切換連接到另一個NameNode
,進行正常的操作,而對于已經連接到該NameNode
節點的HDFS
客戶端可能會卡住,無法進行下一步操作。
HDFS
客戶端到NameNode
的RPC
連接存在keep alive
機制,保持連接不會超時,盡力等待服務器的響應,因此導致已經連接的HDFS
客戶端的操作會卡住。
對于已經卡住的HDFS
客戶端,可以進行如下操作:
等待NameNode
響應,一旦NameNode
所在節點的CPU
利用率回落,NameNode
可以重新獲得CPU
資源時,HDFS
客戶端即可得到響應。
如果無法等待更長時間,需要重啟HDFS
客戶端所在的應用程序進程,使得HDFS
客戶端重新連接空閑的NameNode
。
為了避免該問題出現,在上述問題場景下,可以在客戶端的配置文件core-site.xml
中做如下配置:
將ipc.client.ping
配置為false
,讓客戶端會使用配置項ipc.ping.interval
對應的值,作為timeout
時間,在該時間內沒有得到響應,即會超時
將ipc.ping.interval
配置一個較大的超時時間,避免服務繁忙時的超時,建議配置為900000
,單位為ms
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
的數量有關的,最終是根據DataNode
的數量確定讀寫超時時間,計算方式是以讀寫超時時間的值乘以節點的數量,邏輯在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. 管道中節點的數量 */ 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客戶端讀寫超時時間的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。