Raspberry PiでHadoop(擬似分散モード)を動かす

はじめに

Raspberry PiでHadoopを動かす。
ただし、擬似分散モード。
Raspbianの導入と固定IPの設定まで完了している前提。
Raspberry PiにRaspbianを導入する - もょもとの技術ノート
ゴールはName Node, Data Node, Resource Managerを稼働させ、
円周率を計算するサンプルプログラムを動かすこと。
残念ながら、History Serverも動かすと、サンプルプログラムが原因不明のエラーで失敗してしまう。
一つ一つの動作が超絶遅いので、もー大変だった。

バージョン

準備

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade

Open JDK導入

pi@raspberrypi ~ $ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)

Oracle Javaをアンインストールせずに、Open JDKを導入。

pi@raspberrypi ~ $ sudo apt-cache search jdk
pi@raspberrypi ~ $ sudo apt-get install openjdk-7-jdk
pi@raspberrypi ~ $ java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-2~deb7u1+rpi1)
OpenJDK Zero VM (build 24.65-b04, mixed mode)

パスフレーズなしでssh ログインできるようにする

pi@raspberrypi ~ $ ssh-keygen -t rsa -P ''
pi@raspberrypi ~ $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
pi@raspberrypi ~ $ ssh localhost

解凍

HADOOP_HOMEは/opt/hadoop-2.5.1とした。

pi@raspberrypi /opt $ sudo tar zxf hadoop-2.5.1.tar.gz
pi@raspberrypi /opt/hadoop-2.5.1 $ sudo chown pi -R .

hadoop-env.sh

JAVA_HOMEを設定する

pi@raspberrypi /opt/hadoop-2.5.1 $ vi etc/hadoop/hadoop-env.sh

# The java implementation to use.
# export JAVA_HOME=${JAVA_HOME}
JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

core-site.xml

pi@raspberrypi /opt/hadoop-2.5.1 $ vi etc/hadoop/core-site.xml

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>

あれー、今見直すと、公式ドキュメントは「fs.default.name」ではなくて、「fs.defaultFS」だった。orz
http://hadoop.apache.org/docs/r2.5.1/hadoop-project-dist/hadoop-common/SingleCluster.html

hdfs-site.xml

レプリケーション数を設定する。
擬似分散なので1でよい。

pi@raspberrypi /opt/hadoop-2.5.1 $ vi etc/hadoop/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

Secondary Name Node を止める

擬似分散なので(略)

pi@raspberrypi /opt/hadoop-2.5.1 $ vi  $ sbin/start-dfs.sh

#---------------------------------------------------------
# secondary namenodes (if any)

# SECONDARY_NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -secondarynamenodes 2>/dev/null)

# if [ -n "$SECONDARY_NAMENODES" ]; then
#   echo "Starting secondary namenodes [$SECONDARY_NAMENODES]"

#   "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \
#       --config "$HADOOP_CONF_DIR" \
#       --hostnames "$SECONDARY_NAMENODES" \
#       --script "$bin/hdfs" start secondarynamenode
# fi

Name Node初期化

pi@raspberrypi /opt/hadoop-2.5.1 $ ./bin/hadoop namenode -format

Name Node, Data Node起動

pi@raspberrypi /opt/hadoop-2.5.1 $ sbin/start-dfs.sh

ってすると

ssh: Could not resolve hostname with: Name or service not known

というメッセージが大量に出力される。
ssh - Hadoop 2.2.0 : "name or service not known" Warning - Stack Overflow
によるとHadoopのデフォルト ネイティブ ライブラリが32bit用のため、
正しいパスを教えてやらんといけないとのこと。
hadoop-env.shに下記を追記。

pi@raspberrypi /opt/hadoop-2.5.1 $ vi etc/hadoop/hadoop-env.sh

export HADOOP_HOME=/opt/hadoop-2.5.1
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

再度、start-dfs.shを実行する。

Name Node, Data Nodeの起動確認

http://192.168.1.X:50070/ にアクセス。
ファイアウォールを設定している場合は、注意が必要。
DataNodeの起動には数分時間を要した。
f:id:moyomot:20140915222223p:plain

HDFSにディレクトリを作成してみる

pi@raspberrypi /opt/hadoop-2.5.1 $ bin/hadoop fs -mkdir /user
pi@raspberrypi /opt/hadoop-2.5.1 $ bin/hadoop fs -ls /

問題なければ、OK

Resource Managerの起動

pi@raspberrypi /opt/hadoop-2.5.1 $ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
pi@raspberrypi /opt/hadoop-2.5.1 $ vi etc/hadoop/mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
pi@raspberrypi /opt/hadoop-2.5.1 $ vi etc/hadoop/yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>
pi@raspberrypi /opt/hadoop-2.5.1 $ sbin/start-yarn.sh

Resource Managerの起動確認

http://192.168.1.X:8088/ にアクセス。
f:id:moyomot:20140915223613p:plain

円周率プログラム起動

pi@raspberrypi /opt/hadoop-2.5.1 $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar pi 1 1

ってやるとまた、エラーが発生。
/binにJavaのパスがないといけないとのこと。
http://cloudcelebrity.wordpress.com/2014/01/31/yarn-job-problem-application-application_-failed-1-times-due-to-am-container-for-xx-exited-with-exitcode-127/

pi@raspberrypi /opt/hadoop-2.5.1 $ sudo ln -s /usr/bin/java /bin/java

これで、うまくいくかなーと思いつつ、再度実行すると

Exception from container-launch: ExitCodeException exitCode=1:

のエラーが多発。ログを見てもなんの情報なく、途方にくれる。
次の日、Name Nodeを初期化して、再度実行すると何故かうまく行った。
うーむ、一番困るパターン。

また、Map Reduceは正常終了するものの、ログに次のメッセージが大量に出る。

Retrying connect to server: 0.0.0.0/0.0.0.0:10020.

hadoop - Connection Error in Apache Pig - Stack Overflow
参考にするとHistory Serverを起動せねばならないとのこと。

pi@raspberrypi /opt/hadoop-2.5.1 $ sbin/mr-jobhistory-daemon.sh start historyserver

これを起動すると、再接続メッセージはなくなるが、Map Reduceが正常終了しなくなるという
意味不明状態。

まとめ

Name Node, Data Node, Resource Managerを稼働させ、
円周率を計算するサンプルプログラムを動かすことはできた。
History Serverも起動させてMapReduceを正常動作させることはできていない。orz