CubieTruck(Cubieboard) Hadoop構築


CubieTruckでHadoop クラスタ構築してみた。

![IMG_0058.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/a1cfa6b9-99b1-2d05-1d1f-6a3566353c3b.jpeg)

```
■ハード構成　
　・自作無線ルータ（Raspberry Pi）　
　・CubieTruck (Fedora 19)
　　　・NameNode 1台
     ・DataNode   4台
```

```
■ミドル構成
  ・Oracle JDK 1.7 for ARM
  ・Hadoop 2.2.0
```

<h2>インスール手順 (全ノードで実施）</h2>
<h3>/etc/hostsの設定(DNSの場合は省略)</h3>

```
# vi /etc/hosts
  ※以下を追記
   192.168.100.2  master00 master00.localdomain
   192.168.100.3  slave01   slave01.localdomain
   192.168.100.4  slave02   slave02.localdomain
   192.168.100.5  slave03   slave03.localdomain
````
<h3>JDKのインストール</h3>
HadoopはJavaベースで動いているので、JDKのインストールします。
 ※OpenJDKでも動くみたいです。

```
# cd /usr/local/src
# wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-i586.tar.gz
 # tar zxvf jdk-7u67-linux-i586.tar.gz
 # mv jdk1.7.0_60 /opt/
```
<h3>Hadoop実行ユーザの準備</h3>
hadoop起動ユーザを作成します。

```
# groupadd hadoop
# useradd -g hadoop hduser
# passwd hduser
   New UNIX password:  ← 適当
   Retype new UNIX password:  ← 同じ
```

<h3>sshの準備</h3>
HadoopはNode間をssh接続（パスワードなし）で接続するので、パスワードなしで接続できるように設定します。

```
# su - hduser
$ ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_rsa): (※)
Created directory '/home/hduser/.ssh'.
   ：
(※)そのままReturn

$ cd
$ cat ./.ssh/id_dsa.pub >> ./.ssh/authorized_keyschmod 600
$ ./.ssh/authorized_keys 
$ ssh localhost
 ※ノンパスワードでsshアクセスできることを確認。
　（初回アクセス時のみyesが必要）
　NameNodeで設定したカギを各ノードに配布してノード間も
　パスワード無しでアクセス可能としておきます。
```

<h3>Hadoop 2.2.0のインストール</h3>
  http://www.apache.org/dyn/closer.cgi/hadoop/core/
　 ※適当なミラーから「hadoop-2.2.0.tar.gz」ダウンロード

```
$ exit   ← hduser から抜けます。
# cd /usr/local.src
# wget http://ftp.riken.jp/net/apache/hadoop/core/hadoop-2.2.0/hadoop-2.2.0.tar.gz
# tar zxvf hadoop-2.2.0.tar.gz 
# mv hadoop-2.2.0 /opt/hadoop

※所有権を実行ユーザに変更
# chown -R hduser:hadoop /opt/hadoop
```

<h3>Hadoop用の環境変数設定</h3>
hadoopの起動に必要な環境変数を設定します。

```
# su - hduser
$ vi ~/.bashrc
  ※以下を追記
  export JAVA_HOME=/opt/jdk1.7.0_60
  export PATH=$JAVA_HOME/bin:$PATH
  export HADOOP_INSTALL=/opt/hadoop-2.2.0
  export PATH=$PATH:$HADOOP_INSTALL/bin
  export PATH=$PATH:$HADOOP_INSTALL/sbin
  export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
  export HADOOP_COMMON_HOME=$HADOOP_INSTALL
  export HADOOP_HDFS_HOME=$HADOOP_INSTALL
  export YARN_HOME=$HADOOP_INSTALL
```
設定の確認

```
$ source ~/.bashrc
$ hadoop version
Hadoop 2.2.0
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
This command was run using /opt/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar
```

pathが取っていればversionが表示されます。

<h3>Hadoop設定ファイルの編集</h3>
設定ファイル

```
・${HADOOP_INSTALL}/etc/hadoop/core-site.xml
・${HADOOP_INSTALL}/etc/hadoop/yarn-site.xml
・${HADOOP_INSTALL}/etc/hadoop/mapred-site.xml
・${HADOOP_INSTALL}/etc/hadoop/hdfs-site.xml
・${HADOOP_INSTALL}/etc/hadoop/slave
```

まず、HDFSのディレクトリを作成します。

```
$ exit   ← hduser から抜けます。
# mkdir -p /export/hdfs/namenode
# mkdir -p /export/hdfs/datanode
# chown -R hduser:hadoop /export/hdfs
```

設定ファイルを作っていきます。
すべてのファイルに共通してconfigurationタグの間を修正します。

□core-site.xml

```
# su - hduser
$ vi ${HADOOP_INSTALL}/etc/hadoop/core-site.xml
```

```
<?xml version="1.0" encoding="UTF-8"?>
  <!--
    Licensed under the Apache License, Version 2.0 (the "License");      　
   ：省略

<configuration>
  <!-- ここから追記 -->
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master00:9000</value>
    </property>
  <!-- ここまで -->
</configuration>
```

□yarn-site.xml

```
$ vi ${HADOOP_INSTALL}/etc/hadoop/yarn-site.xml
```
```
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed under the Apache License, Version 2.0 (the "License");      　：省略
<configuration>
  <!-- ここから追記 -->
   <property>
        <name>yarn.nodemanager.aux-services</name>                                   
        <value>mapreduce_shuffle</value>
    </property>
    <property>
      <name>
        yarn.nodemanager.aux-services.mapreduce.shuffle.class
      </name> 
     <value>
         org.apache.hadoop.mapred.ShuffleHandler
     </value>
    </property>
    <!-- ここまで -->
</configuration> 
```

□mapred-site.xml

```
$ cd ${HADOOP_INSTALL}/etc/hadoop/
$ cp mapred-site.xml.template mapred-site.xml
$ vi mapred-site.xml
```
```
<?xml version="1.0" encoding="UTF-8"?>
 <!-- Licensed under the Apache License, Version 2.0 (the "License");
      　：省略
<configuration>
   <!-- ここから追記 -->
   <property>
        <name>mapreduce.framework.name</name>
          <value>yarn</value>
   </property>
   <!-- ここまで -->
</configuration> 
```

□hdfs-site.xml

```
$ vi ${HADOOP_INSTALL}/etc/hadoop/hdfs-site.xml
```
```
<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed under the Apache License, Version 2.0 (the "License"); 
     　：省略
<configuration>
  <!-- ここから追記 -->
  <property> 
    <name>dfs.replication</name>
    <value>4</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/export/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/export/hdfs/datanode</value> 
  </property>
  <!-- ここまで -->
</configuration> 
```

□slave(Namenodeのみ）

```
master00
slave01
slave02
slave03
```

これで設定完了です。

<h3>NameNodeのフォーマット</h3>
最初にNameNodeをフォーマットする必要があります。
master00にsshで接続します。

```
# su - hduser
$ hdfs namenode -format
```

実行ログが出力され、完了です。

<h3>Hadoop起動</h3>
master00にsshで接続します。

```
# su - hduser
$ start-all.sh
```

これで起動が完了です。
起動後に各ノードでプロセスチェックを行います。

□master00

```
# su - hduser
$ jps
 549 NameNode
 920 ResourceManager
 1023 NodeManager
 755 SecondaryNameNode
 1349 Jps
 640 DataNode
```

□slave0x

```
# su - hduser
$ jps
 654 Jps
 380 DataNode
 539 NodeManager
```

Web UIで確認
http://master00:50070/

![hdoop.png](https://qiita-image-store.s3.amazonaws.com/0/52867/f0d83bc4-69ff-6964-5ea7-e6a5c9283cf0.png)

構築は以上、exampleなどで実行可能な状態となりました。

【補足】
ARM系でのHadoop利用はコスト面ではいいかも知れませんが、Map Reduceは、各ノードの処理速度が遅いため実用的でないと感じました。
以下の参考記事に、Apache Sparkにすれば、メモリ不足も解消できるそうなので、そちらも試したいと思います。

参考
http://www.dzone.com/articles/big-data-processing-arm-0