最弱のHadoopクラスタをRaspberry Piで構築する

はじめに

HadoopのHA勉強したいなーと思い、Hadoopクラスタ組んでみました。
で、環境をどうするかが問題です。
次のパターンでHadoopクラスタ組めないか、考えました。

  1. AWS
  2. サーバー自作で仮想化
  3. インテルのNUC
  4. Raspberry Pi

AWSって最高じゃないですか。でも、手元に物理的な筐体がないと物足りないんですよね。なんだろ、これ。
サーバー自作は最後まで考えました。CPU何にするかまで考えました。でも、物理的に大きなものが、我が家に存在すると、いろいろ問題があるのですよ。奥様的に。で、却下。
インテルのNUC欲しかったです。でもSSDとか電源とか別途購入する必要があり、結果的にコストオーバー。
んで、消去法で、Raspberry PiでHadoopクラスタ組んでみることになりました。
ゴールはNameNode、DataNode、ResourceManager、NodeManagerの起動とします。

f:id:moyomot:20141106223005j:plain
f:id:moyomot:20141106222956j:plain

結論

レイテンシ的に、最弱のHadoopクラスタでした。
コマンド発行した後にレスポンス返ってくるのが、遅いんで勉強には適してません。
ストレスたまりまくり。

構成

NameNode, JobTracker 1台。(node1)
DataNode, TaskTracker 5台。(node2 - node6)
HAなどの構成は未実施。
基本的な設定は疑似分散のときと同様。

準備

  • Raspbianの導入
  • hostnameの変更
  • 固定IPの設定
  • Open JDKのインストール
  • パスフレーズなしでログインできるようにする
  • Hadoop実行ユーザーはpi

Raspberry PiにRaspbianを導入する - もょもとの技術ノート
Raspberry PiでHadoop(擬似分散モード)を動かす - もょもとの技術ノート

/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

JAVA_HOMEとHADOOP_HOMEを設定する

# 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にアクセス
f:id:moyomot:20141106215530p:plain

$ 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

NodeManager起動

$ sbin/yarn-daemon.sh start nodemanager

http://node1:8088/cluster/nodesにアクセス
f:id:moyomot:20141106221931p:plain

終了ー!

まとめ

Raspberry PiでHadoopクラスタ動きました。
でも、すごく遅いのでストレスたまります。
自学には適していませんでした(泣)