Datanode Hang with High thread blocked

前段時間線上的Flume突然不穩定起來,各種socket read/write timeout. Block recover也一直不成功.查看Datanode的日誌確實這段時間packresponder各種連接失敗,讀取失敗,各種異常:PrematureEOF from inputStream/Connection reset/Interrupted receiveBlock/,在某些條件下也觸發壞塊的產生.

奇怪的是這段時間有問題的datanode的負載,網卡IO都不高,只是出問題時datanode會伴隨着high session.接着部署個集羣的thread監控才發現了原因:

Datanode默認每6dfs.datanode.directoryscan.interval)小時調用DirectoryScanner去做內存和磁盤數據集塊校驗,而這個過程fdataset這個數據結構一直持有獨佔鎖,導致其他的線程都被BLOCK住,而數據量越大在默認情況1個(dfs.datanode.directoryscan.threads)線程的執行時間越久.雖然在HADOOP-4584後分離了diskscanner和heartbeat sender但是還是存在共享競爭資源,所以嚴重情況下仍然可能導致假死.知道了原因後,把這個參數調大後可以加速掃描速度,進而降低鎖的時間使得datanode快速恢復服務:

可以看到,調整後threadblock數極大降低了:

wKiom1MUsYuQxZu7AAOq5VKvJcY350.jpg


這個問題在HADOOP2.3.0改善了一部分,將getfilelength部分以async disk scan的方式獲取,降低了鎖定的時間.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章