CDH2 から CDH3 Update 2 からのアップデートしてみましたので、簡単にその方法を紹介します。本番環境でアップデートするのに要した時間は、約 1 時間くらいです。
公式ドキュメントはここにあります。
まず、CDH3 ではユーザまわりの変更が入っています。
CDH3 でのユーザアカウントの変更
- hdfs: NameNode, DataNodes, Secondary NameNode(従来の hadoop ユーザにあたります、CDH3 にアップデートすると自動的に hadoop ユーザが hdfs ユーザに変更されるので注意してください)
- mapred: JobTracker and TaskTrackers(JobTracker と TaskTracker 用に追加された新しいユーザになります)
ローカルファイルシステムのディレクトリオーナー
- dfs.name.dir: hdfs:hadoop 700
- dfs.data.dir: hdfs:hadoop 700
- mapred.local.dir: mapred:hadoop 755
- HADOOP_LOG_DIR: anyuser:hadoop 775
HDFS 上のディレクトリオーナーの変更
- mapred.system.dir: mapred:hadoop 700
- / (root directory): hdfs:hadoop 755
Step1: アップグレードする前の準備
1. すべての Hadoop サービスをシャットダウンします
$ sudo -u hadoop /usr/lib/hadoop-0.20/bin/stop-all.sh
2. hadoop ユーザのプロセスがないことを動いていないことを確認します
$ sudo su hadoop -s /bin/bash -c "jps"
3. NameNode マシン上の HDFS メタデータをバックアップします
SecondaryNode がある場合は、NameNode のおメタデータをバックアップしているためスキップしても大丈夫だと思います
メタデータをバックアップするために、dfs.name.dir の場所を確認します
$ grep -C1 dfs.name.dir /etc/hadoop/conf/hdfs-site.xml
dfs.name.dir
/var/lib/hadoop-0.20/cache/hadoop/dfs/name
$ cd /var/lib/hadoop-0.20/cache/hadoop/dfs/name
$ sudo tar -cvf /root/nn_backup_data.tar .
Step2: Hadoop のコアパッケージ hadoop-0.20 のアップグレード
1. local yum repostiory 設定で、CDH2 から CDH3 に切り替えます
2. すべての Hadoop クラスターのホストにおいて、パッケージのアップグレードする
$ sudo yum upgrade hadoop-0.20*
Hadoop version 0.20.1+169.127-1 -> 0.20.2+923.142-1 になる(2011/11/15 時点)
その他必要なパッケージを、それぞれのホストにインストールします
- NameNode: hadoop-0.20-namenode, hadoop-0.20-jobtracker
- Secondary NameNode: hadoop-0.20-secondarynamenode
- Slave: hadoop-0.20-datanode, hadoop-0.20-tasktracker
3. hadoop-env.sh の HADOOP_MASTER 環境変数を確認します(僕の環境の場合、設定がなかったのでスキップしました)
4. Hadoop システムアカウントを確認します
$ id hdfs
$ id mapred
hadoop ユーザは削除されるので注意します
5. HDFS データのオーナーを確認します
hdfs-site.xml の dfs.name.dir, dfs.data.dir の設定を確認します
dfs.data.dir の設定がない場合は、hdfs-site.xml に追加します
hdfs-site.xml の設定が変わるので注意しましょう。hadoop-0.20-conf-pseudo をインストールして、その設定ファイルをベースに設定するといいと思います。また、hadoop-0.20-dfs.data.dir の設定が hdfs-site.xml に存在しないと CDH3 はシャットダウンしてしまうらしいので注意しましょう
$ ls -ld /var/lib/hadoop-0.20/cache/hadoop/dfs/name
drwxr-xr-x 4 hdfs hadoop 4096 Nov 6 16:49 /var/lib/hadoop-0.20/cache/hadoop/dfs/name/
もし、オーナーがおかしければ変更します
$ sudo chown -R hdfs:hadoop /var/lib/hadoop-0.20/cache/hadoop/dfs/name
6. MapReduce のローカルディレクトリのオーナーとパーミッションを変更します
$ ls -ld /var/lib/hadoop-0.20/cache/hadoop/mapred/local
drwxr-xr-x 4 hdfs hadoop 4096 Nov 6 16:38 /var/lib/hadoop-0.20/cache/hadoop/mapred/local/
$ sudo chown -R mapred /var/lib/hadoop-0.20/cache/hadoop/mapred/local
7. すべてのホストのログディレクトリのオーナーとパーミッションを変更します
$ sudo chgrp hadoop /var/log/hadoop-0.20
$ sudo chmod g+w /var/log/hadoop-0.20
$ sudo chown mapred /var/log/hadoop-0.20/userlogs
8. HDFS メタデータをアップグレードします
別のターミナル画面で、NameNode のログを確認しておきます
namenode$ sudo tail -f /var/log/hadoop-0.20/hadoop-hadoop-namenode*
メタデータをアップグレードします
namenode$ sudo /etc/init.d/hadoop-0.20-namenode upgrade
ログで、次のメッセージが表示されると成功したということになります
2011-11-06 17:15:27,390 INFO org.apache.hadoop.hdfs.server.common.Storage: Upgrade of /var/lib/hadoop-0.20/cache/hadoop/dfs/name is complete.
NameNode は、DataNode に接続するまでの間、セーフモードになっているため、注意しましょう(このあと DataNode を開始すると、自動的にセーフモードが解除されます)
9. HDFS を開始します
それぞれのスレーブホストにて、HDFS を開始します
slaveX$ sudo /etc/init.d/hadoop-0.20-datanode start
すこし待って、DataNode のアップグレードが完了すると、次のメッセージが NameNode のログに出力されます
Safe mode will be turned off automatically in X seconds.
DataNode のアップグレードプロスが完了すると、NameNode は自動的にセーフモードを終了して、HDFS は通常のフルオペレーションが可能になります。そのときは、NameNode のログに、次のような内容が出力されます
...
The reported blocks 8 has reached the threshold 0.9990 of total blocks 8. Safe mode will be turned off automatically in X seconds.
...
2011-11-07 18:33:28,009 INFO org.apache.hadoop.hdfs.StateChange: STATE* Leaving safe mode after 137 secs.
...
2011-11-07 18:33:28,009 INFO org.apache.hadoop.hdfs.StateChange: STATE* Safe mode is OFF.
...
Safe Mode 中かどうかは、次のコマンドで確認することができます
namenode$ sudo hadoop dfsadmin -safemode get
Safe mode is OFF
10. HDFS 上の mapred.system.dir ディレクトリのオーナーを変更します
NamaNode に mapred.system.dir の設定がない場合は、hdfs://namenode/var/lib/hadoop-0.20/cache/hadoop/mapred/system になるため、なければ作成します。
namenode$ sudo -u hdfs hadoop fs -chown -R mapred hdfs://namenode/var/lib/hadoop-0.20/cache/hadoop/mapred/system
11. それぞれのホストで、SecondaryNameNode と MapReduce を開始します
secodarynamenode$ sudo /etc/init.d/hadoop-0.20-secondarynamenode start
slaveX$ sudo /etc/init.d/hadoop-0.20-jobtracker start
slaveX$ sudo /etc/init.d/hadoop-0.20-tasktracker start
念のため、プロセスを確認します
$ ps eaf | grep -i job
$ ps eaf | grep -i task
12. 基本的なクラスター操作を確認します
適当なディレクトリを作成します
namenode$ sudo -u hdfs hadoop fs -mkdir /test
HDFS のユーザディレクトリのオーナーを変更してみます
$ sudo -u hdfs hadoop fs -chown joe /user/joe
通常ユーザで計算ジョブを走らせてみます
$ hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-0.20.2*examples.jar pi 10 10000
…
Job Finished in 61.474 seconds
Estimated value of Pi is 3.14120000000000000000
13. HDFS アップグレードを終了させます
namenode$ sudo -u hdfs hadoop dfsadmin -finalizeUpgrade
http://:50070/ の Upgrades 欄を確認して「There are no upgrades in progress.」と表示されていることを確認します。このメッセージが表示されていれば、無事成功したことになります。
その他、実際の運用面では、Hadoop のジョブは、mapred ユーザで実行したほうが楽です。(他のユーザで実行するには、HADOOP_LOG_DIR やその他 Hadoop のディレクトリのパーミッションを変更する必要があります)
すこしだけ、ジョブの実行スピードが速くなったような気がします。
Recent Comments