ついつい CDH4.1 から CDH4.4 にアップグレードしてしまいましたので、手順を省いて注意点などを記しておきます。
機能的には What’s New in CDH4.4.0 まで見てもメリットよりリスク不安の方が高いのですが、Hadoop新担当者の運用鍛錬という名目でゴリッとやってもらって、私はその後ろで煽ってました。
手順について
How to upgrade from CDH4.0 to CDH4.1 for Debian | 外道父の匠 と流れは同じで、だけなので難しいことは特にありません。
QJM HAも特になにもなかったです。
なので、細かいメモだけ書いておきます。
NameNode WARNログ
挙動に支障はないのですが、読み書き両方ともにHDFSを利用するとこんなWARNログが毎回残るようになりました。例は fluentd からの書き込みなのでユーザが td-agent になっています。
1 |
WARN org.apache.hadoop.security.UserGroupInformation: No groups available for user td-agent |
これについて調べたところ、わりと古い話題ですが
bash -c “id -Gn td-agent” が返らないのが原因ということで、user, group を作って回避しました。これが正当な対応かはアレですが… 目的がログなくすことだったので log4j でフィルタするよりは元を断つべきかな、と。
1 2 |
addgroup --gid $GID td-agent adduser --uid $UID --gid $GID --no-create-home td-agent |
hiveの出力抑制
hive につなぐとき以下の SLF4J メッセージが出るように。
1 2 3 4 5 6 7 8 |
$ hive Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j.properties Hive history file=/tmp/user/hive_job_log_52377416-9e3a-492c-acb0-498d8df67a64ea_168241697.txt SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/lib/zookeeper/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/lib/hive/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. hive> |
jobの実行等には問題はないので、出力させたくないなら /usr/lib/zookeeper/lib/slf4j-log4j12-1.6.1.jar を退避すればOKです。
hdfsのホームディレクトリ
/etc/passwd のhdfsユーザがこんな感じなのですが
1 |
hdfs:x:108:112:Hadoop HDFS,,,:/usr/lib/hadoop-0.20:/bin/bash |
/usr/lib/hadoop-0.20 ディレクトリがないとHDFSが起動しなくなりました。
CDH3からアップグレードし続けている弊害と思われます。
たいしたことじゃないのでディレクトリを作成して回避しました。usermodでもいいと思います。
1 2 |
mkdir /usr/lib/hadoop-0.20 chown hdfs. /usr/lib/hadoop-0.20 |
NameNodeのhosts
名前解決の方法が変わった部分があるのか、以下のようなエラーにより、HDFSのsafemodeが解除されない状態になりました。NameNode
1 |
WARN org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager: Unresolved datanode |
DataNode
1 2 3 |
FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool ~snip~ Datanode denied communication with namenode |
これはNameNodeの /etc/hosts に DataNode のリストを載せることで解決しました。ちなみに、Hadoop的に必要だったので元々DNSで正引きできるようにしてありましたが、それでは不足なようで。
HiveMetastore
Hive 0.10 でスキーマがだいぶ変わってるから気をつけようねって話。事件当時の思ひ出Tweet
ちゃんとジョブ止めたので何も起きなかったし、スキーマは基本見なくて大丈夫なところだけど、アップグレードクエリは気持ち確認しておいた方がいいですね。
1 2 3 4 5 |
cd /usr/lib/hive/scripts/metastore/upgrade/mysql/ cat upgrade-0.9.0-to-0.10.0.mysql.sql cat 010-HIVE-3072.mysql.sql cat 011-HIVE-3649.mysql.sql cat 012-HIVE-1362.mysql.sql |
hive load
load元と先に同じファイル名があったら上書きされてたのが、今回からエラーになったようです。どっちかっつーと正しい挙動になったような感じ。
今回はCDH4.4にしただけで、BigDataシステム的には何も変わってないのですが、Cloudera SearchがGAになって遊べるようになってるとか、Impalaもバージョンが上がってきてるとかあるし、あんま放っておくと追随するのがしんどくなるので、やっといて損はなかったかなーと。
Hadoopを教えるのは大変というか難しいけど、もう文献は揃ってるし、Hadoopの完全分散環境を作るのにOpenStackがあるととても練習してもらいやすいしで、だいぶ進行がスムーズなこの頃。安定過ぎてまたガツンと何かをやりたい気分がモヤリ。