天天看點

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

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

<a href="http://s3.51cto.com/wyfs02/M02/1A/61/wKiom1MUsYuQxZu7AAOq5VKvJcY350.jpg" target="_blank"></a>

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

本文轉自MIKE老畢 51CTO部落格,原文連結:http://blog.51cto.com/boylook/1367235,如需轉載請自行聯系原作者