CubieTruck(Cubieboard) Hadoop + Spark1.0.2 cluster構築


Hadoop HDFSと連携するためApache Sparkをインストールしてみた。

インストール手順

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

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

Hadoop構築時に行った、hosts設定、Javaのインストール、SSHノンパス処理は割愛します。
【Hadoop構築手順】
　http://qiita.com/tsunaki/items/41b9ea36ae99b7702ae3

<h3>Sparkのインストール</h3>

```
# cd /usr/local/src
# wget http://ftp.riken.jp/net/apache/spark/spark-1.0.2/spark-1.0.2-bin-hadoop2.tgz 

# tar zxf spark-1.0.2-bin-hadoop2.tgz 
# mv spark-1.0.2-bin-hadoop2 /opt/

```

これで既にStandalone modeで動きます。

ここから、cluster設定を行います。

```
# mv spark-1.0.2-bin-hadoop2 /opt/
# cd /opt/spark-1.0.2-bin-hadoop2
# cp conf/spark-env.sh.template conf/spark-env.sh

# vi conf/spark-env.sh.template
```

一番下にmasterのIPを追記します。

```
#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
# Copy it as spark-env.sh and edit that to configure Spark for your site.

# Options read when launching programs locally with
# ./bin/run-example or ./bin/spark-submit
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public dns name of the driver program
# - SPARK_CLASSPATH, default classpath entries to append

# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program
# - SPARK_CLASSPATH, default classpath entries to append
# - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos

# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests (Default: ‘default’)
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.

# Options for the daemons used in the standalone deploy mode:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
# - SPARK_MASTER_OPTS, to set config properties only for the master (e.g. "-Dx=y")
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node
# - SPARK_WORKER_DIR, to set the working directory of worker processes
# - SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. "-Dx=y")
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers

# ADD master00 
SPARK_MASTER_IP=192.168.100.2
```

次にslavesを設定します。

```
# vi conf/slaves
```
localhostの記述をいかに変更します。

```
master00
slave01
slave02
slave03
```

このディレクトリを各slaveに展開します。
※masterと同じにすること。


展開後にmaster00で起動処理

```
# su - hduser
$ /opt/spark-1.0.2-bin-hadoop2/start-all.sh
```

これで完了です。

WEBで起動の確認

![spark.png](https://qiita-image-store.s3.amazonaws.com/0/52867/d7ba7138-9ff5-e079-2e79-41246c792cbd.png)

クラスターで動いてることを確認できます。

確認できたらHadoopと連結して動作確認してみます。

先ずテストデータを準備します。ここでは郵便番号を使用します。
（処理はすべてmaster00で行ってます）

```
# su - hduser
$ wget http://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip
$ unzip ken_all.zip

$ nkf -w KEN_ALL.CSV > KEN_ALL.CSV.utf
### UTFに変換します。
$ mv KEN_ALL.CSV.utf KEN_ALL.CSV 
### HFDSに登録
$ hdfs dfs -put KEN_ALL.CSV /user/
$ hdfs dfs -ls /user
[hduser@master00 ~]$ hdfs dfs -ls /user
14/08/29 21:55:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r--   4 hduser supergroup   12232566 2014-08-29 21:07 /user/KEN_ALL.CSV
```

Spark-shellを起動させてます。

```
$ /opt/spark-1.0.2-bin-hadoop2/bin/spark-shell
```
![スクリーンショット 2014-08-29 21.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/52867/e7902fec-2a45-f467-f931-e1abacc20e61.png)

Hadoopのテキストを読み込みます。

```
scala> val file = sc.textFile("hdfs://master00:9000/user/KEN_ALL.CSV")
```
![スクリーンショット 2014-08-29 22.11.59.png](https://qiita-image-store.s3.amazonaws.com/0/52867/f59da7d5-da7a-3c69-f07d-281aab14d132.png)

読み込んだことを確認してみます。

```
scala> file.count()
```
![スクリーンショット 2014-08-29 22.12.49.png](https://qiita-image-store.s3.amazonaws.com/0/52867/312f021a-cd8d-cd3d-1a3b-143e88d220c8.png)

次に横浜という文字を検索してみます

```
scala> file.filter(line => line.contains("横浜")).foreach(println)
```
![スクリーンショット 2014-08-29 22.14.41.png](https://qiita-image-store.s3.amazonaws.com/0/52867/5670d8df-5950-e543-aad0-c0e8985372b9.png)

検索できたことが確認できます。

以上

HadoopのMapReduceに比べると、ものすごく早くなりました。
これならARMのCPUボードでも十分活用できそうです。