たごもりすメモ

コードとかその他の話とか。

WebHDFSとHttpFs(Hoop)に見るHDFSクライアントチューニングの話

前に書いた通りHDFSへの書き込みをHoop Server経由からWebHDFS経由に変更している。

これまで(Hoop Server)

Hoop Server経由で書き込んでいたとき。クラスタで重めのMapReduceジョブを走らせると、その時間帯に書き込んだデータを後で読み出したときに checksum error となって読み出しに失敗することが多く、なんでかなコレと悩んでいた。たぶんDataNode経由でデータ追記するのに長時間を必要としたとき、クライアントがTimeoutしちゃった場合のロールバックが中途半端なんじゃないかなとは思う。

ところで Hoop Server の設定には NameNode および DataNode へのタイムアウトを指定する方法などが無い。
DFSClient一般の設定としては dfs.socket.timeout ならびに dfs.datanode.socket.write.timeout などが指定できるようだが Hoop Server の設定をHadoopクラスタ全体の設定と共有して一括でこの指定をするのも何か違うような気がする。Hoop Server 専用の設定セットを作るのも面倒くさい。このあたりは Hoop Server の設定として指定できてほしいと思う。できれば NameNode に対するものと DataNode に対するものを分けて指定したい。

HttpFsとしても変わらないままだとしたらちょっと辛いですね。プロキシタイプのソフトウェアはそこの生死が全てのリクエストに影響するので、こういったパフォーマンス系の設定はできるだけこまめにできていいと思う。

いま(WebHDFS)

WebHDFSでの書き込みはNameNodeへのアクセス・DataNodeへのアクセスともにクライアントからHTTPとして実行する。このときクライアントは当然それぞれへのHTTPリクエストのタイムアウトを自分で細かく制御できるので、やろうと思えばNameNodeへのタイムアウトは短く取る、DataNodeへのタイムアウトは長く、ということも自由自在である。

ということでHTTPリクエストのタイムアウトを延ばしていってみたらWebHDFSのHTTPリクエストレベルでの失敗が激減、その結果、該当の時間帯のデータを読み出してみてもI/O Errorがゼロというのがこの5日ばかり連続していて、たいへん満足度高い状態で過ごしております。