Fedora17でCDH4をインストールし、擬似分散モードを起動させた際のメモ

Fedora17でCDH4をインストールした。
また擬似分散モードでの起動を確認した。

インストール

JDK6をインストールする


CDH4がOracleのJDK6に依存しているので、
http://www.oracle.com/technetwork/java/javase/downloads/jdk6u37-downloads-1859587.htmlよりインストーラをダウンロードしてインストールする。

$ cd ダウンロード
$ chmod +x jdk-6u37-linux-x64-rpm.bin
$ sudo ./jdk-6u37-linux-x64-rpm.bin 
$ sudo alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_37/bin/java 20000


~/.bashrcに以下を追加する

$ export JAVA_HOME=/usr/java/jdk1.6.0_37
$ export PATH=$JAVA_HOME/bin:$PATH


以下で有効にする。

$ source ~/.bashrc


javaのバージョンを確認する。

$ java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01, mixed mode)
$javac -version
javac 1.6.0_37
CDH4.1.2をインストールする

CDHをyumを使ってインストールする。

CDH用にリポジトリを追加する。

https://ccp.cloudera.com/display/CDH4DOC/CDH4+Installation#CDH4Installation-AddingaYumRepositoryRedHat/CentOS6 64-bit向けrepoファイルをコピーする。

cloudera-cdh4.repo

[cloudera-cdh4]
name=Cloudera's Distribution for Hadoop, Version 4
baseurl=http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/4/
gpgkey = http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera    
gpgcheck = 1

上記のテキストファイルcloudera-cdh4.repoを/etc/yum.repos.d以下にコピーする。

リポジトリキーを追加する。

$ sudo rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera

yumからHadoopをインストールする。

$ sudo yum clean all
$ sudo yum install hadoop

完全分散モード用の設定ファイルをコピーして、オリジナルをいじらないようにしておく。
以下のコマンドを実行すると、完全分散モード用の設定ファイルがconf.myclusterにコピーされ、
/etc/hadoop/confからconf.myclusterのファイルを修正出来るよになる。

$ cd /etc/hadoop
$ sudo cp -rf conf.empty conf.mycluster

Hadoopを動かしてみる

スタンドアローンモードで動かす

スタンドアローンモードは特に設定ファイルは不要。
必要なパッケージをインストールして、hadoopgrepを使ってみる。

$ sudo yum install hadoop-mapreduce hadoop-0.20-mapreduce

作業用ディレクトリ~/hadoop/test0/を作成して、そこに適当なテキストファイルを放り込み、hadoopgrepを実行する。

$ mkdir -p ~/hadoop/test0/
$ cd ~/hadoop/test0/
$ mkdir input
$ cp ~/sample.txt input
$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-*-examples.jar grep ./input/ output 'hoge'

このコマンドを実行すると、outputディレクトリが作成されて、'hoge'の単語数が./output/part-00000に出力される。

擬似分散モードで動かす

擬似分散モード用のパッケージをインストールして、
擬似分散モードでhadoopgrepを使ってみる。

$ sudo yum install hadoop-conf-pseudo

このコマンドを実行すると、alternativesで/etc/hadoop/confに/etc/hadoop/conf.pseudoがインストールされる。

$ alternatives --display hadoop-conf
hadoop-conf -ステータスは自動です。
リンクは現在 /etc/hadoop/conf.mycluster を指しています。
/etc/hadoop/conf.empty - 優先項目 10
/etc/hadoop/conf.mycluster - 優先項目 60
/etc/hadoop/conf.pseudo - 優先項目 30
現在の「最適」バージョンは /etc/hadoop/conf.mycluster です。

設定ファイルを擬似分散モードに切り替える。

$ sudo alternatives --config hadoop-conf 

3 プログラムがあり 'hadoop-conf' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /etc/hadoop/conf.empty
*+ 2           /etc/hadoop/conf.mycluster
   3           /etc/hadoop/conf.pseudo

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:3

*** HDFSのフォーマットと起動


formatしてRe-format filesystem in Storage Directory?でYを選択するclusterIDが更新される。

$ sudo -u hdfs hdfs namenode -format
$ sudo service hadoop-hdfs-namenode start
$ sudo service hadoop-hdfs-datanode start
$ sudo service hadoop-hdfs-secondarynamenode start

hdfs中に必要なディレクトリを作成をする。

$ sudo -u hdfs hadoop fs -mkdir /tmp
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp
$ sudo -u hdfs hadoop fs -ls /
Found 1 items
drwxrwxrwt   - hdfs supergroup          0 2012-11-30 21:35 /tmp
$ sudo -u hdfs hadoop fs -mkdir /var/log/hadoop-yarn
$ sudo -u hdfs hadoop fs -chown yarn:mapred /var/log/hadoop-yarn
$ sudo -u hdfs hadoop fs -mkdir /tmp/hadoop-yarn/staging
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging
$ sudo -u hdfs hadoop fs -mkdir /tmp/hadoop-yarn/staging/history/done_intermediate
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging/history/done_intermediate
$ sudo -u hdfs hadoop fs -chown -R mapred:mapred /tmp/hadoop-yarn/staging
$ sudo -u hdfs hadoop fs -mkdir /user/$USER
$ sudo -u hdfs hadoop fs -chown $USER /user/$USER

リソースマネージャの起動をする。

$ sudo service hadoop-yarn-resourcemanager start
$ sudo service hadoop-yarn-nodemanager start
$ sudo service hadoop-mapreduce-historyserver start

ここまで実行すると、psコマンドで以下のプロセスが立ち上がっている事を確認する事が出来る。

$  ps -ef | grep java
hdfs      2113     1  0 18:06 ?        00:00:10 /usr/java/jdk1.6.0_37/bin/java -Dproc_namenode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-namenode-localhost.localdomain.log -Dhadoop.home.dir=/usr/lib/hadoop -Dhadoop.id.str=hdfs -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.NameNode
hdfs      2248     1  0 18:07 ?        00:00:09 /usr/java/jdk1.6.0_37/bin/java -Dproc_datanode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-datanode-localhost.localdomain.log -Dhadoop.home.dir=/usr/lib/hadoop -Dhadoop.id.str=hdfs -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -server -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.datanode.DataNode
hdfs      2446     1  0 18:09 ?        00:00:05 /usr/java/jdk1.6.0_37/bin/java -Dproc_secondarynamenode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-secondarynamenode-localhost.localdomain.log -Dhadoop.home.dir=/usr/lib/hadoop -Dhadoop.id.str=hdfs -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
yarn      2952     1  0 18:12 ?        00:00:10 /usr/java/jdk1.6.0_37/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-yarn-resourcemanager-localhost.localdomain.log -Dyarn.log.file=yarn-yarn-resourcemanager-localhost.localdomain.log -Dyarn.home.dir=/usr/lib/hadoop-yarn -Dhadoop.home.dir=/usr/lib/hadoop-yarn -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -classpath /etc/hadoop/conf:/etc/hadoop/conf:/etc/hadoop/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/.//*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-yarn/lib/*:/etc/hadoop/conf/rm-config/log4j.properties org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
yarn      3224     1  1 18:12 ?        00:00:13 /usr/java/jdk1.6.0_37/bin/java -Dproc_nodemanager -Xmx1000m -server -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-yarn-nodemanager-localhost.localdomain.log -Dyarn.log.file=yarn-yarn-nodemanager-localhost.localdomain.log -Dyarn.home.dir=/usr/lib/hadoop-yarn -Dhadoop.home.dir=/usr/lib/hadoop-yarn -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -classpath /etc/hadoop/conf:/etc/hadoop/conf:/etc/hadoop/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/.//*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-yarn/lib/*:/etc/hadoop/conf/nm-config/log4j.properties org.apache.hadoop.yarn.server.nodemanager.NodeManager
mapred    3558     1  0 18:17 ?        00:00:06 /usr/java/jdk1.6.0_37/bin/java -Dproc_historyserver -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-mapreduce -Dhadoop.log.file=yarn-mapred-historyserver-localhost.localdomain.log -Dhadoop.home.dir=/usr/lib/hadoop -Dhadoop.id.str= -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dmapred.jobsummary.logger=INFO,JSA -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer

jpsコマンドを使うと以下のように3つだけ表示される。

$ sudo jps
3558 JobHistoryServer
4867 Jps
2952 ResourceManager
3224 NodeManager


以上で擬似分散モードでのHDFSの起動が完了する。

つまずいた箇所

DataNodeが起動しない


"sudo service hadoop-hdfs-namenode"を実行しても、DataNodeが起動しなかった。
原因は、以下のDataNodeのログの一部からもわかる通り、NameNodeとDataNodeでclusterIDが一致しなかったためだ。

DataNodeの実行ログ/var/log/hadoop-hdfs/hadoop-hdfs-datanode-localhost.localdomain.log の一部抜粋

2012-12-01 17:47:56,233 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-1334899232-127.0.0.1-1354351535263 (storage id DS-776307469-127.0.0.1-50010-1354277718964) service to localhost/127.0.0.1:8020
java.io.IOException: Incompatible clusterIDs in /var/lib/hadoop-hdfs/cache/hdfs/dfs/data: namenode clusterID = CID-51ca4356-b4a2-4646-bea3-9af43adc50a1; datanode clusterID = CID-fa5c4789-7c02-4884-91fd-921d46bbfa7a
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:390)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:190)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:218)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:849)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:820)
        at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:308)
        at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:218)
        at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:661)
        at java.lang.Thread.run(Thread.java:662)

clusterIDを一致させる正当な手順が見つけられなかったため、今回は以下のファイルのclusterIDを直接エディタで編集して問題を解決した。

以下のファイルの"clusterID="以降をエディタで編集した。
/var/lib/hadoop-hdfs/cache/hdfs/dfs/data/current/VERSION
/var/lib/hadoop-hdfs/cache/hdfs/dfs/namesecondary/current/VERSION

NameNodeのclusterIDは以下のファイルに記述されている。
/var/lib/hadoop-hdfs/cache/hdfs/dfs/name/current/VERSION

これらファイルを編集して、擬似分散モードの起動手順を繰り返したところ、全てのサービスが立ち上がり、hadoopのサンプルプログラムが実行出来た。