たごもりすメモ

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

CDH3u5でWebHDFS

いろいろあって待ち望んでいたHadoop CDH3u5がリリースされましたね!

注目するところは人それぞれだろうけど、個人的にはWebHDFSのサポートが入ったのが大変嬉しい。前にCDH4で試したりはしていたけどCDH4に移行するのもいろいろアレそうだし、と思っていたのでWebHDFSサポートの入るCDH3u5をマジで待ってた。のでさっそくちょっと確認して、すぐ置き換えてみた。
なおCDH3u5にはHttpFsは入ってないようだ。これはちょっと残念。

  • 移行前: CDH3u2 + Hoop
  • 移行後: CDH3u5 + WebHDFS

設定変更点

WebHDFSを有効にするため、およびHoop/WebHDFSでappendを有効にするために hdfs-site.xml に以下の設定を加えた。

  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>

  <property>
    <name>dfs.support.append</name>
    <value>true</value>
  </property>

  <property>
    <name>dfs.support.broken.append</name>
    <value>true</value>
  </property>

dfs.support.append および dfs.support.broken.append はCDH3u4以降で必要になっているはず。WebHDFSはCDH3u5から。WebHDFSでappendするにも dfs.support.broken.append は必要になる。
これをくっつけて stop-dfs および start-dfs すればよい。WebHDFSの場合は書き込み操作は直接 DataNode に対してアクセスが飛ぶので、DataNode単独できちんと上記の設定が有効になるよう読み込まれている必要があることに注意。DFSClientやNameNodeを経由しないからこの注意が必要になる。

クライアント

WebHDFSクライアントはたぶんまだ世の中にあんまり無い、けどPerlRubyにはクライアントライブラリがあるぞ!

あとはFluentdからなら fluent-plugin-webhdfs が使える。

性能について

まだ限界まで負荷がかかるようなことをしてみてないんだけど、通常時の書き込みを見てる限り以下のような状況。

  • Hoop Server を立てていたNameNodeの通信量が激減
    • 実際のデータ書き込みがDataNodeに直接行くようになったため
    • CPU使用率に10%程度見えていた SoftIRQ (割り込みによるCPU使用率) がほぼゼロに
  • DataNode側の通信量・CPU使用率のiowaitなどはほぼ変化なし
    • ただしわずかに SoftIRQ の値の上昇が見られるようになった(2〜4%程度)
  • クライアント側から確認できていた書き込み先への通信エラーがなくなった
    • HoopのケースだとMapReduceジョブが走っているときにしばしばクライアントがサーバに接続できない状況が起きていた*1
    • WebHDFSだと無くなった、かも*2

Hoop Serverのように1ヶ所を必ず経由する通信パターンに較べてWebHDFSだと通信負荷がバラけるのは当然のことだけど、やっぱりその影響は大きいかな。

もうひとつ実際には重要なこととして、Tomcatで動くHoop ServerとJettyで動くWebHDFSハンドラ、という違いはあると思う。*3
WebHDFSはHadoop DataNodeが前から動かしているWebコンソールと同じところで処理される。これはJettyで動作しているもので、実際にWebHDFSを叩いてみるとHTTPヘッダにもJetty云々な行がある。

データを継続的に書き込むような通信パターンだとデータ(ペイロード)の受信時間が長く、Tomcatのように同期的に処理するアーキテクチャのサーバだと並列度が高くなるならそのぶんだけスレッド数を増やすしかない。スレッド数を増やせばそのぶんだけコンテキストスイッチのコストがかさむ。スレッド数が足りなければクライアントは接続に失敗する。
その点Jettyは非同期I/Oをサポートしたアプリケーションサーバなので、Network I/OならびにDisk I/O待ちの間は他の接続の相手にCPUを使える*4。それなりに多くの通信の並列処理も得意なはずだから、特に大きいサイズのデータについての通信処理ではTomcatに較べて状況が改善するのは納得できる。

数日これで様子見て、特別問題がなければそのままWebHDFSを使い続ける予定。さてどうかな。

*1:Fluentdのリトライの範囲で、問題にならない程度になんとかなっていた

*2:もっと重いジョブが走ったときの状況を確認する必要があるけど

*3:HttpFsはどっちだたっけ……?

*4:ようになっている、というか DataNode はそう作られている、はず