イベント2つを経て、何から書くか迷うところですが、先に @tagomoris との約束を果たすためにCDH3からCDH4への具体的なアップグレード手順を紹介します。
この約束を果たすと、@ryu_kobayashi が Huahin Framework をCDH4対応してくれるというパーフェクトフローになっておりますが、JobTrackerがResourceManagerになってるので大変そうですね!
はじめに
公式
過去記事
OSについて
Debian Squeeze です。LennyにはCDH4は存在しませんし、無理矢理もほぼ不可能です。CentOSとかはパッケージ操作が違うだけのはずなので、適当に変換してください。
MapReduceについて
当然、YARNです。設定ファイルについて
どのように設定ファイルを編集したかは紹介しますが、絶対に物足りないので、別途次の記事で実際に使っている設定も紹介したいと思います。気合で description に日本語説明を残してあるので結構需要があるはず。
ディレクトリパスなど
ホスト名・ディレクトリ名・ファイルパスなどは空気を読んで脳内変換をお願いします。ここでは基本的なデータディレクトリを /data 、SLAVEの複数HDDを /disk/1, /disk/2, … としています。
冗長化構成について
NameNodeやJobTrackerはDRBDなどで冗長化しているかもですが、その部分は抜いて説明します。CDH3停止と削除
先に監視アラートを止めておいたり、政治的な手続きは済ませておいてください。全ノードの停止
HadoopのMaster,Slaveサーバ全台で実行します。
1 |
for init in /etc/init.d/hadoop-* ; do $init stop ; done |
NameNodeでバックアップ
1 2 |
cd /data/hadoop/cache/hdfs/dfs/name/ tar czf /var/tmp/namenode20120831.tar.gz ./ |
SecondaryNameNodeでバックアップ
石橋を叩く。
1 2 |
cd /data/hadoop/cache/hdfs/dfs/namesecondary/ tar czf /var/tmp/secondarynamenode20120831.tar.gz ./ |
Fuseアンマウント
マウントしてるサーバ全台で解除しておきます。
1 |
fusermount -u /mnt/hadoop |
Hive Metastoreでバックアップ
1 |
mysqldump -u root -p hive_metastore > /var/tmp/hive_metastore.sql |
全Hadoopでパッケージ削除
1 2 |
apt-get -y --force-yes purge hadoop-0.20 apt-get -y autoremove |
sources.list 更新
cdh3行を削除しておきます。
1 |
vim /etc/apt/sources.list |
CDH4インストール
Hadoop全台で実行します。APT設定
1 2 3 4 5 6 7 8 |
cd /usr/local/src wget http://archive.cloudera.com/cdh4/one-click-install/squeeze/amd64/cdh4-repository_1.0_all.deb dpkg -i cdh4-repository_1.0_all.deb curl -s http://archive.cloudera.com/cdh4/debian/squeeze/amd64/cdh/archive.key | apt-key add - # sources.list の確認 cat /etc/apt/sources.list.d/cloudera-cdh4.list |
パッケージインストール
hadoopパッケージ以外は必要に応じて。avahiはログイン遅延回避のため削除。
1 2 3 4 5 6 7 |
apt-get update apt-get -y --force-yes install hadoop hive \ sun-java6-jre sun-java6-bin sun-java6-jdk \ libxml2-utils libmysql-java apt-get -y purge avahi-daemon apt-get -y -f autoremove |
Hive用jdbc
1 2 3 |
cd /usr/local/src curl -L 'http://www.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.15.tar.gz/from/http://mysql.he.net/' | tar xz cp mysql-connector-java-5.1.15/mysql-connector-java-5.1.15-bin.jar /usr/lib/hive/lib/ |
設定ディレクトリを作成
既存のパスを利用する場合は一度 mv でどけておいたほうがよいです。CentOSの場合は /usr/sbin/alternatives になっています。
1 2 3 4 5 6 7 8 9 |
mkdir /etc/hadoop/conf.cluster chown -R root:hadoop /etc/hadoop/conf.cluster update-alternatives --install \ /etc/hadoop/conf hadoop-conf \ /etc/hadoop/conf.cluster 100 # 確認 update-alternatives --display hadoop-conf |
ディレクトリ作成
HDFS, MapReduce, ログ用のディレクトリはCDH3のをそのまま利用します。YARN用のディレクトリはSLAVEサーバの分散HDD配下に必要とするので後で作ります。
ulimit
パッケージにより /etc/security/limits.d/ に色々入るので確認しておきます。pseudoを用意する
適当な仮想環境にでもpseudoで擬似分散環境を作成しておきます。pseudoは正常に動くので、困ったときに見比べたり設定検証をするとよいです。多分、ないと厳しいです。
1 |
apt-get install hadoop-conf-pseudo |
設定
ファイル構成
/etc/hadoop/conf/ 配下のファイル構成は、pseudoを参考にしてください。デフォだと余計なのが入って動かない、とか注意点があります。で、そこに対して古い site.xml を上書きして編集する形がよろしいかと・・・
CDH3からCDH4への変換方法
プロパティ名の違いはこちらに記載されています。このリストをvim置換コマンドに変換したものがこちらになります。
このコマンドをCDH3の core-site.xml, hdfs-site.xml, mapred-site.xml に対して実行し、新規に yarn-site.xml を作成すれば完了となります。ただし、過去記事にも書いた通り、Hiveなどは古い設定を必要としていたりするので、これだけだと期待通りに動かなくなります。
そのため、いったん変換後の設定で動かして足りない分を補足していくか、1つのファイルに変換前+変換後の設定両方を記載してあとで削っていくかのどちらかになります。
具体的な設定
私はいったん変換して、あとから補足していきました。その仕上がった具体的な設定については、多いので次の記事で紹介します。(後でリンクもはっておきます)仮想環境の場合、設定の配布ができたら、ここまでの状態をイメージでとっておくと他が楽になります。
NameNodeのインストール
1 |
apt-get install hadoop-hdfs-namenode |
HDFSメタデータを更新します。
1 |
service hadoop-hdfs-namenode upgrade |
ログの確認をします。
1 |
less /data/hadoop/log/hadoop-hdfs-namenode-hostname-of-namenode.log |
起動しなかったら原因を解決してから起動します。
1 |
/etc/init.d/hadoop-hdfs-namenode start |
管理画面の確認をします。
https://issues.apache.org/jira/browse/HDFS-2608
SecondaryNameNodeのインストール
まず、元のデータをどけておきます。そうしないと、おそらくVERSIONファイルの食い違いによって同期エラーとなります。
1 |
mv /data/hadoop/cache/hdfs/dfs/namesecondary /data/hadoop/cache/hdfs/dfs/~back_namesecondary |
インストールします。
1 |
apt-get install hadoop-hdfs-secondarynamenode |
ログの確認をします。
1 |
less /data/hadoop/log/hadoop-hdfs-secondarynamenode-hostname-of-secondarynamenode.log |
起動しなかったら原因を解決してから起動します。
1 |
/etc/init.d/hadoop-hdfs-secondarynamenode start |
管理画面の確認をします。
DataNode / NodeManager のインストール
SLAVEサーバ全台で実行します。yarn.nodemanager.local-dirs と yarn.nodemanager.log-dirs のディレクトリを作成します。/disk/1, /disk/2, … というディスクに対しての内容です。HDFS, Mapred はCDH3用のをそのまま使います。
1 2 3 4 5 6 |
for topdir in /disk/* do mkdir -p $topdir/yarn/local mkdir -p $topdir/yarn/logs chown -R yarn:yarn $topdir/yarn done |
CDH3のログが邪魔なら削除しておきます。
1 |
rm /data/hadoop/log/hadoop-hadoop-* |
インストールします。
1 |
apt-get -y install hadoop-hdfs-datanode hadoop-yarn-nodemanager hadoop-mapreduce |
ログの確認をします。
1 2 |
less /data/hadoop/log/hadoop-hdfs-datanode-hostname-of-slave.log less /data/hadoop/log/yarn-yarn-nodemanager-hostname-of-slave.log |
失敗したら修正して起動します。
1 2 |
/etc/init.d/hadoop-hdfs-datanode start /etc/init.d/hadoop-yarn-nodemanager start |
HDFSディレクトリ作成
YARN用のHDFSディレクトリを作成しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
su - hdfs # yarn.app.mapreduce.am.staging-dir hadoop fs -mkdir /user/history hadoop fs -chmod -R 1777 /user/history hadoop fs -mkdir /user/hdfs hadoop fs -chown hdfs:hdfs /user/hdfs hadoop fs -mkdir /user/root hadoop fs -chown root:root /user/root # historyserver用 # yarn.nodemanager.remote-app-log-dir # mapreduce.jobhistory.done-dir hadoop fs -mkdir /mr-history/tmp hadoop fs -mkdir /mr-history/done hadoop fs -chmod 1777 /mr-history/tmp hadoop fs -chmod 0750 /mr-history/done hadoop fs -chown -R mapred:hadoop /mr-history # node manager用 # yarn.nodemanager.remote-app-log-dir hadoop fs -mkdir /var/log/hadoop-yarn/apps hadoop fs -chmod 1777 /var/log/hadoop-yarn/apps hadoop fs -chown yarn:hadoop /var/log/hadoop-yarn/apps |
ResourceManagerのインストール
JobTrackerはResourceManagerとHistoryServerに分れましたが、一緒のサーバにいれても分けても問題無いです。
1 2 |
apt-get install hadoop-yarn-resourcemanager apt-get install hadoop-mapreduce-historyserver |
ログの確認をします。
1 2 |
less /data/hadoop/log/yarn-yarn-resourcemanager-hostname-of-job.log less /data/hadoop/log/yarn-mapred-historyserver-hostname-of-job.log |
失敗したら修正して起動します。
1 2 |
/etc/init.d/hadoop-yarn-resourcemanager start /etc/init.d/hadoop-mapreduce-historyserver start |
管理画面を確認します。
Hive Metastoreのschemaアップグレード
1 2 3 4 |
cd /usr/lib/hive/scripts/metastore/upgrade/mysql/ mysql -u hive -p hive_metastore mysql> SOURCE upgrade-0.7.0-to-0.8.0.mysql.sql; |
Fuseインストール
CDH3と変りません。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# インストール apt-get install hadoop-hdfs-fuse ln -s /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server/libjvm.so /usr/lib/ # マウント mkdir /mnt/hadoop /usr/bin/hadoop-fuse-dfs /mnt/hadoop -o rw,server=hostname-of-namenode,port=8020,rdbuffer=131072 # 確認 ls -l /mnt/hadoop # アンマウントする場合 fusermount -u /mnt/hadoop |
起動時設定。
/etc/fstab
1 |
hadoop-fuse-dfs#dfs://hostname-of-namenode:8020 /mnt/hadoop fuse rw,auto,rdbuffer=131072 0 0 |
ジョブ実行テスト
実行してResouceManagerやHistoryServerの管理画面に形跡が残っていればOK。
1 |
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.0.0-cdh4.0.0.jar pi 2 4 |
成功したらHiveも実行してみる。
他のエコシステム入れてたり、環境によって色々違うと思いますが、Hadoop+Hiveだとこんな感じということで。。公式の説明を元に進めて、少し補足しただけの内容ですが、設定ファイル以外はほとんど困ることはありませんでした。
ということで次回は出血大サービスで外道式CDH4設定を紹介したいと思います。