Google Compute Engine上でSparkクラスタ環境を構築


# はじめに
SparkのインストールについてはApache Spark入門(翔泳社)を参考にしました。最終的に作る環境はGCEで以下のインスタンスを作成する
spark-master x1
spark-worker x2
spark-client x1

# 1. 共通イメージの作成。全インスタンス共通の設定をしておく。
共通イメージは、以下の項目のチェックを外しておく。これはディスクからイメージを作る際にインスタンスとディスクの紐付けを解除するためにインスタンスを削除する必要があるのであるが、その際にデータを消さないようにするため。
「インスタンスを削除する際にブートディスクを削除する」
メタデータをクリックし、sshキーの箇所で公開鍵を登録する。

```
$ ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no user名@IPアドレス
```
#### JDKのインストールと設定
Oracke JDKをダウンロード。CookieにAcceptしたというリクエストを含めてwgetすれば、同意したとみなされ、URL直指定でもダウンロードできる。

```
$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.rpm

$ sudo rpm -ivh jdk-8u66-linux-x64.rpm 
```

環境変数を設定

```/etc/profile.d/java.sh
$ export JAVA_HOME=/usr/java/default
$ export PATH=$JAVA_HOME/bin/:$PATH
```
 
#### Sparkのインストールと設定
SparkはHadoop2.6以上向けにビルドされたものを使用する。

```
$ wget http://d3kbcqa49mib13.cloudfront.net/spark-1.5.2-bin-hadoop2.6.tgz
$ sudo tar zxvf spark-1.5.2-bin-hadoop2.6.tgz -C /opt/
$ cd /opt
$ sudo ln -s spark-1.5.2-bin-hadoop2.6 spark
```

```/etc/profile.d/spark.sh
export SPARK_HOME=/opt/spark
```

```
source /etc/profile
```

```
$ /opt/spark/bin/spark-submit --version
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.5.2
      /_/
                        
Type --help for more information.
```

```
$ /opt/spark/bin/spark-submit --class org.apache.spark.examples.SparkPi /opt/spark/lib
/spark-examples-1.5.2-hadoop2.6.0.jar 10
・・・・
Pi is roughly 3.142552
・・・
```

```
$ sudo rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera

$ sudo rpm -ivh http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
```

```/etc/yum.repos.d/cloudera-cdh5.repo
[cloudera-cdh5]
# Packages for Cloudera's Distribution for Hadoop, Version 5, on RedHat or CentOS 6 x86_64
name=Cloudera's Distribution for Hadoop, Version 5
baseurl=http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5/
gpgkey = http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera    
gpgcheck = 1
```            

```
$ yum clean all
Loaded plugins: fastestmirror, security
Cleaning repos: base cloudera-cdh5 extras scl updates
Cleaning up Everything
Cannot remove rpmdb file /var/lib/yum/rpmdb-indexes/pkgtups-checksums
Cannot remove rpmdb file /var/lib/yum/rpmdb-indexes/file-requires
Cannot remove rpmdb file /var/lib/yum/rpmdb-indexes/version
Cannot remove rpmdb file /var/lib/yum/rpmdb-indexes/conflicts
```

インスタンスをリブートすると/etc/hostsがなぜか初期化される？ようなので、/etc/rc.localでhostsファイルを設定するように仕込む。本当はchefやansible、もしくはgceの標準の機能でできそうであるが、後でやり方を調べる。

ここまででベースとなるディスクはできたので、ここからイメージを作成する。

イメージ=>新しいイメージ作成で、先ほど作成したインスタンス名を指定し、イメージを作成する。

# 2. Hadoopのインストールと設定
#### 2.1. masterノード
spark-masterにNameNodeと、ResourceManagerをインストール

```
$ sudo yum install -y hadoop-hdfs-namenode
$ sudo yum install -y hadoop-yarn-resourcemanager
```

#### 2.2. workerノード

```
$ sudo yum install -y hadoop-hdfs-datanode
$ sudo yum install -y hadoop-yarn-nodemanager
```

workerノードは複数作成するので、このノードのイメージを作成し、そのイメージを使ったインスタンステンプレートを作成。そしてインスタンスグループで４台作成する。

#### 2.3. Clientノード

```
$ sudo yum install -y hadoop-hdfs hadoop-yarn
```

#### 2.4. Hadoop共通設定
全てのノードで以下の設定を行う。

```core-site.xml
<configuration>
   <property>
      <name>fs.defaultFS</name> #利用する分散ファイルシステムを指定
      <value>hdfs://spark-master01:8020</value>
   </property>
   <property>
      <name>hadoop.tmp.dir</name> #HDFSやYARNが利用する一時ディレクトリ
      <value>/hadoop/tmp</value>
   </property>
</configuration>
```

```hdfs-site.xml
<configuration>
  <property>
     <name>dfs.namenode.name.dir</name> #NameNodeがHDFS上のファイルのメタデータを保存するディレクトリを指定
     <value>file:///hadoop/hdfs/name</value>
  </property>

  <property>
     <name>dfs.datanode.data.dir</name> #DataNodeがブロックを保存するディレクトリを指定。このディレクトリの容量の合計値/3(ブロックの複製数）がHDFSとして格納できるデータ容量。
     <value>file:///hadoop/hdfs/data</value>
  </property>
</configuration>
```

```yarn-site.xml
<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name> #ResourceManagerが動作するマシンのホスト名
    <value>spark-master</value>
  </property>

  <property>
    <name>yarn.nodemanager.log-dirs</name> #コンテナのログの格納先。
    <value>file:///hadoop/yarn/node-manager/logs</value>
  </property>

  <property>
    <name>yarn.nodemanager.local-dirs</name> #NodeManagerが利用するローカルディスクのパス
    <value>file:///hadoop/yarn/node-manager/local</value>
  </property>
</configuration>
```

HDFSやYARNの動作に必要なディレクトリを作成

```
$ sudo mkdir -p /hadoop/hdfs
$ sudo chown hdfs:hadoop /hadoop/hdfs
$ sudo chmod 775 /hadoop/hdfs
$ sudo mkdir -p /hadoop/yarn
$ sudo chown yarn:hadoop /hadoop/yarn
$ sudo chmod 775 /hadoop/yarn
$ sudo mkdir -p /hadoop/tmp
$ sudo chmod 777 /hadoop/tmp
```

```
# sudo -u hdfs hdfs namenode -format
```

#### 2.5. HDFSの起動と動作確認
spark-worker01,02で以下のコマンドを実行

```
# service hadoop-hdfs-datanode start
```

spark-master01で以下のコマンドを実行

```
# service hadoop-hdfs-namenode start
```

確認

```
# sudo -u hdfs hdfs dfsadmin -report
Configured Capacity: 10432602112 (9.72 GB)
Present Capacity: 7175352320 (6.68 GB)
DFS Remaining: 7175311360 (6.68 GB)
DFS Used: 40960 (40 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (1):
Name: 10.240.0.5:50010 (spark-worker01.c.yotsu-1130.internal)
Hostname: spark-worker01.c.yotsu-1130.internal
Decommission Status : Normal
Configured Capacity: 10432602112 (9.72 GB)
DFS Used: 40960 (40 KB)
Non DFS Used: 3257249792 (3.03 GB)
DFS Remaining: 7175311360 (6.68 GB)
DFS Used%: 0.00%
DFS Remaining%: 68.78%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Wed Nov 18 01:03:44 UTC 2015
```

HDFS上に各種ディレクトリを作成

```
# sudo -u hdfs hdfs dfs -mkdir -p /hadoop/tmp
# sudo -u hdfs hdfs dfs -chmod 777 /hadoop/tmp
# sudo -u hdfs hdfs dfs -mkdir -p /tmp
# sudo -u hdfs hdfs dfs -chmod777 /tmp
# sudo -u hdfs hdfs dfs -mkdir -p /hadoop/yarn/app-logs
# sudo -u hdfs hdfs dfs -chmod 777 /hadoop/yarn/app-logs
# sudo -u hdfs hdfs dfs -mkdir -p /user/y_tadayasu
# sudo -u hdfs hdfs dfs -chown y_tadayasu:y_tadayasu /user/y_tadayasu
```

#### 2.6. YARNの起動と動作確認
spark-worker01,02で以下のコマンドを実行

```
# service hadoop-yarn-nodemanager start
```

spark-master01で以下のコマンドを実行

```
# service hadoop-yarn-resourcemanager start
```

確認

```
# sudo -u yarn yarn node -list -all
15/11/18 01:14:07 INFO client.RMProxy: Connecting to ResourceManager at spark-master01/10.240.0.2:8032
Total Nodes:2
         Node-Id             Node-State Node-Http-Address       Number-of-Running-Containers
spark-worker02.c.yotsu-1130.internal:38198              RUNNING spark-worker02.c.yotsu-1130.internal:8042       
                          0
spark-worker01.c.yotsu-1130.internal:41966              RUNNING spark-worker01.c.yotsu-1130.internal:8042       
                          0
```

# 3. Sparkの動作確認
サンプルプログラムを実行する。

```
$ ./bin/spark-submit --master yarn-client --class org.apache.spark.examples.Spark
Pi /opt/spark/lib/spark-examples-1.5.2-hadoop2.6.0.jar 10
・・・
Pi is roughly 3.1425
・・・
```