たごもりすメモ

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

CDH4にしたらDNSによる名前解決がうまくいかなくなった(解決した)

CDH3u5で使っていたクラスタをOSそのまま(再起動すらしてない)でCDH3をまるっと削除してCDH4に変えたところ、突然名前解決ができないと言いだしてまるで動かない状態になって右往左往していた。まるで原因が見えず失意のどん底に落ち無力感にさいなまれると試して当然と思えることがまったく思い付かなくなってヤバい。

なお症状としては以下の通り。誰かがぐぐったときのために細かく書いておく。

  • CDH3u5 + Java6 では問題ない
    • java 1.6.0_29, java 1.6.0_33, java 1.6.0_38 のどれでも問題はなかった
  • CDH4.1.2 + Java6 で以下の問題が起きた
    • java 1.6.0_33 および java 1.6.0_38 のどちらでも発生
  • ホスト名の解決ができなくなる
    • DataNodeからNameNodeに接続できない
      • DataNodeのログに以下のようなメッセージが延々出る
 Problem connecting to server: namenode:8020
      • DEBUGログとか出してもこれ以外に出てこない
    • fs.defaultFS その他ホスト指定をIPアドレスで指定
      • DataNodeからNameNodeへの接続は通るようになる
      • HDFS WebUI でHDFSの中身を見ているとき、DataNodeに飛んだあとNameNodeに接続ができない
 java.lang.IllegalArgumentException: java.net.UnknownHostException: namenode.hostname.fqdn
      • ページ遷移時、わざわざIPから逆引きした名前でNameNodeが指定され、それが解決できないためらしい
    • /etc/hosts にNameNodeのホスト名を記述
      • なんか起動するようにはなった
    • distcpとかがコケる
      • 正確には _SUCCESS が作られて正常終了するのに、欠落しているファイルが多い
      • part-00000.gz を展開して見てみると FATAL なログが大量に出ている(名前解決の失敗)
      • なんでそれで _SUCCESS なんだ……

結果として名前解決を本気でどうにかしなければならなかった。

結論

resolv.conf は元々以下のようであった。CDH3で動いてたし、Hadoopと関係ないあれこれも正常に普通に動いてる。CDH4にしたらコケた。

search localdomain secondarylocaldomain
nameserver xx.xx.xx.xx
options rotate timeout:1 attempts:2

options から rotate を外したらCDH4でも正常に動作するようになった(ように見える)。

search localdomain secondarylocaldomain
nameserver xx.xx.xx.xx
options timeout:1 attempts:2

Hadoopのレイヤでこんなところハンドリングしてないだろと思い込んでたんだけど、改めて見てみるとCDH3とCDH4の差しか無いんだよなあ。うーん。
rotate指定してるのにnameserverがひとつしか無いという状況を想定してなかったんだろうけど、あーもー。ということでハマってました。ああもう。