最弱のHadoopクラスタをRaspberry Piで構築する
はじめに
HadoopのHA勉強したいなーと思い、Hadoopクラスタ組んでみました。
で、環境をどうするかが問題です。
次のパターンでHadoopクラスタ組めないか、考えました。
AWSって最高じゃないですか。でも、手元に物理的な筐体がないと物足りないんですよね。なんだろ、これ。
サーバー自作は最後まで考えました。CPU何にするかまで考えました。でも、物理的に大きなものが、我が家に存在すると、いろいろ問題があるのですよ。奥様的に。で、却下。
インテルのNUC欲しかったです。でもSSDとか電源とか別途購入する必要があり、結果的にコストオーバー。
んで、消去法で、Raspberry PiでHadoopクラスタ組んでみることになりました。
ゴールはNameNode、DataNode、ResourceManager、NodeManagerの起動とします。
構成
NameNode, JobTracker 1台。(node1)
DataNode, TaskTracker 5台。(node2 - node6)
HAなどの構成は未実施。
基本的な設定は疑似分散のときと同様。
/etc/hosts
node1 - node6共通設定
ip6は無効にする
設定変更後はサーバー再起動
#::1 localhost ip6-localhost ip6-loopback #fe00::0 ip6-localnet #ff00::0 ip6-mcastprefix #ff02::1 ip6-allnodes #ff02::2 ip6-allrouters #127.0.1.1 node1 192.168.11.51 node1 192.168.11.52 node2 192.168.11.53 node3 192.168.11.54 node4 192.168.11.55 node5 192.168.11.56 node6
Hadoopインストール
node1 - node6共通設定
/optにhadoopをインストールする
ディレクトリに移動して、解凍して、オーナー変更する
pi@node1 /opt $ sudo tar zxf hadoop-2.5.1.tar.gz pi@node1 /opt/hadoop-2.5.1 $ sudo chown pi -R .
Javaのパス
node1 - node6共通設定
Javaのパスが通っていないと怒られるので、通しておく
/bin/bash: /bin/java: No such file or directory
pi@node1 /opt/hadoop-2.5.1 $ sudo ln -s /usr/bin/java /bin/java
hadoop-env.sh
# export JAVA_HOME=${JAVA_HOME} JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::") 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"
core-site.xml
node1 - node6共通設定
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node1:9000</value> </property> </configuration>
hdfs-site.xml
node1 - node6共通設定
pi@node1 /opt/hadoop-2.5.1 $ mkdir -p dfs/data pi@node1 /opt/hadoop-2.5.1 $ mkdir -p dfs/name
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/hadoop-2.5.1/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/hadoop-2.5.1/dfs/name</value> </property> </configuration>
NameNode初期化
node1のみ
pi@node3 /opt/hadoop-2.5.1 $ bin/hdfs namenode -format pi@node1 /opt/hadoop-2.5.1 $ sbin/hadoop-daemon.sh start namenode pi@node1 /opt/hadoop-2.5.1 $ jps 2917 NameNode 2964 Jps
DataNode起動
node2 - node6
pi@node2 /opt/hadoop-2.5.1 $ sbin/hadoop-daemon.sh start datanode pi@node2 /opt/hadoop-2.5.1 $ jps 2537 Jps 2476 DataNode
http://node1:50070/dfshealth.html#tab-overviewにアクセス
$ time bin/hadoop fs -ls / 14/11/06 12:59:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 2 items drwx------ - pi supergroup 0 2014-09-27 09:27 /tmp drwxr-xr-x - pi supergroup 0 2014-09-27 09:36 /user real 1m1.726s user 0m56.290s sys 0m1.050s
遅いー!
ここまでで、半分終わり
mapred-site.xml
node1 - node6共通設定
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
yarn-site.xml
node1 - node6共通設定
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>node1:8081</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>node1:8082</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>node1:8083</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>node1:8084</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>node1:8088</value> </property> </configuration>
ResourceManager起動
$ sbin/yarn-daemon.sh start resourcemanager
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の起動には数分時間を要した。
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/ にアクセス。
円周率プログラム起動
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