たごもりすメモ

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

CDH4でHiveServerを使う際の注意点

CDHでHadoopを使っている良い子のみんな、hiveserverまわりで罠があるので気をつけましょう! という話。ふたつあるので順番に。

hive-server 再起動時にログがtruncateされる

hiveserverがなんかおかしかったりすると、原因究明はやるとしてとりあえず再起動、という運用をしてしまう気持ちはよくわかります。が、やってしまうとその日の分のログが消える(!)ので注意が必要だ。

原因は /etc/init.d/hive-server *1の hive_start() 中の以下の部分。

    log_success_msg "Starting $desc (${NAME}): "
      $SU -c "cd $HIVE_HOME ; $exec_env nohup \
               $EXE_FILE --service $service_name $PORT \
             > $LOG_FILE 2>&1 < /dev/null & "'echo $! '"> $PID_FILE"
    RETVAL=$?

start時にログを '> $LOG_FILE' でopenしてるので、その時点の内容が消えてしまう。
ClouderaのJIRAにぶちこんだんだけど、その後にリリースされたCDH4.2でも直ってないので注意が必要。1バイト書き足してくれればいいだけなのに……。

ということで、自分で以下のように書き直しましょう。リダイレクトを追記('>>')にするだけですね!

    log_success_msg "Starting $desc (${NAME}): "
      $SU -c "cd $HIVE_HOME ; $exec_env nohup \
               $EXE_FILE --service $service_name $PORT \
             >> $LOG_FILE 2>&1 < /dev/null & "'echo $! '"> $PID_FILE"
    RETVAL=$?

tmpwatchが走って /tmp 下が掃除されるとhiveserverが正常動作しなくなる

これは hive 0.8 および 0.9 が対象、なので CDH 4.0.x および 4.1.x が対象。4.2.0 は hive 0.10 ベースで、そっちだと直ってたのを確認した。hiveserver2で該当するかどうかはわからないが、しそうな気がする。/tmp以下に同じようなxmlが吐かれてたら多分該当する。

hive 0.8 および 0.9 あたりの hiveserver は設定を読み込んだらそれを /tmp/hive-default-xxxx.xml というパスのファイルにいったんダンプし、以降はそれを読んで動作する。パスを変更する手段はなさそうだった。
で、hiveserverを起動しっぱなしにしておくとこのファイルは更新されずにずっと置かれたままで、tmpwatchのクリーニング対象になってしまう。そして消されたら hiveserver は「起動はしている(TCP接続を受け付ける)がクエリが正常に実行されない」状態になる。TCP接続での監視しかしていないと気付けない。

https://issues.apache.org/jira/browse/HIVE-3596

対処方法としては以下のどちらか。

  • CDH 4.2 に更新する metadataの互換性がなかった、全部吹っ飛ばしたくなかったらやめておけ
  • 該当ファイルを touch しつづける cron job でも動かすか tmpwatch の対象から該当ファイルを除外する

この問題にぶちあたってるかどうかは hiveserver のログを見れば、該当ファイルが見付からない! というエラーが出るのでわかるはず。ただし前述の「再起動するとログが消える」状態だと調査が困難を極めるというか迷宮入りになるので注意な。

*1:hive-server2 でも同様なことを確認してある