HDD障害時のHadoop datanodeの対応について

ここ最近毎日のようにHDD障害が発生しててお祓いに行った方が良いのかなと思い始めているwyukawaです。こんばんは。

HadoopのdatanodeにHDD障害が発生した場合、普通はdecommissionすると思います。

ただdecommissionってやたら時間かかるんですよね。まる1日とかね。まあデータ量が多いからだとは思います。例えばTBいかないならdecommissionしてもそんなに時間かからないのかなと思います。完全に想像ですが。

なので僕は下記のようにdatanodeを止めちゃってます。

hadoop-daemon.sh stop datanode

この辺は以前下記にも書きました。
dfs.datanode.failed.volumes.toleratedとdatanodeのdecommission - wyukawa’s blog

こうすると一時期にレプリカ数が足りないブロックが出ますが、ある程度時間が経てばそれもなくなります。dfs.max-repl-streamsの値を増やせばレプリケーションのスピードが上がるようですが試したことは無いです。

For those who want to accelerate replication: you need to adjust an undocumented configuration parameter "dfs.max-repl-streams", which defines maximal number of replications a data-node is allowed to handle at one time. The default it is 2.

[HADOOP-2606] Namenode unstable when replicating 500k blocks at once - ASF JIRA

HDD交換が終わったらdatanodeをまた起動するって感じでやってます。

hadoop-daemon.sh start datanode

ただこのやり方だと1台のdatanodeに複数のHDDを積んでいる場合、まあ積んでいるケースが多いと思いますが、HDDのデータ使用率がアンバランスになっちゃうんですよね。

例えば/data1〜/data9まではDisk使用率60%なのに障害から復旧した/data10はまだデータを持ってないので0%みたいなことになります。/data1〜/data9までにあった既存のデータを削除するっていう手もありますが、データ量も多く削除に時間かかることもありやってません。datanodeを止めた状態でブロックを移動するっていう手もあると思いますが、それも時間かかりそうなのでやってません。

ちゃんとdecommissionすればこういう問題も起こらないのでやはりdecommission出来るならしたほうが良いわけですが、そのためにはノード数を増やして1台が担当するデータ量を減らしたほうが良いのかなと思ってます。例えば1台のDFS使用率ってどのぐらいがいいんですかねえ。。。70%とかいっちゃうとかなり厳しいと思うのでせめて50%ぐらいに抑えた方が良いのかなと勝手に思ってますが、50%でもまだdecommissionに時間かかる気がするし、、、10%にしようとか思うとノード数がすごい増えちゃうのでそれも現実的じゃないわけでいろいろ悩ましいです。

まあ結論としてはHDD障害が無くなればいいということです。