小編給大家分享一下HDFS客戶端讀寫超時(shí)時(shí)間的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是一家專業(yè)提供城北企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為城北眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
前段時(shí)間我們Hadoop
集群磁盤使用率比較高,部分硬盤空間使用超過了70%
,這部分服務(wù)器的DataNode
服務(wù)讀寫負(fù)載就比較高,造成部分?jǐn)?shù)據(jù)同步任務(wù)因?yàn)樽x寫超時(shí)而失敗。具體場(chǎng)景和異常跟這篇博客里描述的很像。
DFSClient
客戶端與HDFS
交互進(jìn)行數(shù)據(jù)讀寫,需要從NameNode
拿到元數(shù)據(jù)信息,再和DataNode
交互,因此,超時(shí)時(shí)間也同時(shí)涉及這兩個(gè)服務(wù)。以下分別是客戶端與這兩個(gè)服務(wù)交互的超時(shí)時(shí)間的解析。
客戶端與NameNode
的操作超時(shí)時(shí)間由以下兩個(gè)配置控制:
ipc.client.ping
:默認(rèn)值是true
。當(dāng)配置為true
時(shí),客戶端會(huì)盡力等待服務(wù)端響應(yīng),定期發(fā)送ping
消息,使得連接不會(huì)因?yàn)?code>tcp timeout而斷開。當(dāng)配置為false
時(shí),客戶端會(huì)使用配置項(xiàng)ipc.ping.interval
對(duì)應(yīng)的值,作為timeout
時(shí)間,在該時(shí)間內(nèi)沒有得到響應(yīng),即會(huì)超時(shí)。
ipc.ping.interval
:以毫秒為單位,默認(rèn)值是1分鐘。當(dāng)ipc.client.ping
配置為true
時(shí),表示發(fā)送ping
消息的周期。當(dāng)ipc.client.ping
設(shè)置為false
時(shí),表示連接的超時(shí)時(shí)間。
當(dāng)NameNode
節(jié)點(diǎn)處于滿負(fù)載、NameNode
所在節(jié)點(diǎn)的CPU
100%
耗盡時(shí),導(dǎo)致NameNode
無(wú)法響應(yīng),對(duì)于新連接到該NameNode
的HDFS
客戶端,能夠主備切換連接到另一個(gè)NameNode
,進(jìn)行正常的操作,而對(duì)于已經(jīng)連接到該NameNode
節(jié)點(diǎn)的HDFS
客戶端可能會(huì)卡住,無(wú)法進(jìn)行下一步操作。
HDFS
客戶端到NameNode
的RPC
連接存在keep alive
機(jī)制,保持連接不會(huì)超時(shí),盡力等待服務(wù)器的響應(yīng),因此導(dǎo)致已經(jīng)連接的HDFS
客戶端的操作會(huì)卡住。
對(duì)于已經(jīng)卡住的HDFS
客戶端,可以進(jìn)行如下操作:
等待NameNode
響應(yīng),一旦NameNode
所在節(jié)點(diǎn)的CPU
利用率回落,NameNode
可以重新獲得CPU
資源時(shí),HDFS
客戶端即可得到響應(yīng)。
如果無(wú)法等待更長(zhǎng)時(shí)間,需要重啟HDFS
客戶端所在的應(yīng)用程序進(jìn)程,使得HDFS
客戶端重新連接空閑的NameNode
。
為了避免該問題出現(xiàn),在上述問題場(chǎng)景下,可以在客戶端的配置文件core-site.xml
中做如下配置:
將ipc.client.ping
配置為false
,讓客戶端會(huì)使用配置項(xiàng)ipc.ping.interval
對(duì)應(yīng)的值,作為timeout
時(shí)間,在該時(shí)間內(nèi)沒有得到響應(yīng),即會(huì)超時(shí)
將ipc.ping.interval
配置一個(gè)較大的超時(shí)時(shí)間,避免服務(wù)繁忙時(shí)的超時(shí),建議配置為900000
,單位為ms
DataNode
的讀寫超時(shí)時(shí)間由以下兩個(gè)配置控制:
讀超時(shí)時(shí)間:dfs.client.socket-timeout
。默認(rèn)值1分鐘。
寫超時(shí)時(shí)間:dfs.datanode.socket.write.timeout
。默認(rèn)8分鐘。
以上配置是在HDFS
客戶端進(jìn)行設(shè)置,它們的默認(rèn)值在org.apache.hadoop.hdfs.server.common.HdfsServerConstants
類里:
// Timeouts for communicating with DataNode for streaming writes/reads // DataNode讀寫超時(shí)時(shí)間 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
讀寫超時(shí)的時(shí)間是跟DataNode
的數(shù)量有關(guān)的,最終是根據(jù)DataNode
的數(shù)量確定讀寫超時(shí)時(shí)間,計(jì)算方式是以讀寫超時(shí)時(shí)間的值乘以節(jié)點(diǎn)的數(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é)點(diǎn)的數(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客戶端讀寫超時(shí)時(shí)間的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!