【Sparkクラスタ構築】Yarnクラスタ稼働環境を構築します

#1.構成図
本投稿で、下記の構造ようなHadoopYarnクラスタの環境を構築します。

- マスタの構成
  - Master: 192.168.0.100
- ワーカノードの構成
  - Worker1: 192.168.0.101
  - Worker2: 192.168.0.102

#2.クラスタに必要なユーザの作成
クラスタ環境では、それぞれのノード間で互いにアクセスすることがあります。そのユーザーは同じユーザIDしか利用できないということがあります。それによってクラスタ構築する前に、まずマスタノードとワーカノード上に全部hadoopyarnユーザを作成しておきます。
####2.1.Master
Master上で、hadoopyarnユーザーを作ります。

```
# ユーザ作成
sudo adduser hadoopyarn
# パスワード設定
sudo passwd hadoopyarn ※PW：hadoopyarn01
# フォルダOwner変更
sudo chown hadoopyarn /home/hadoopyarn
# 管理者権限付与
sudo vim /etc/sudoers
# 下記を追加する
hadoopyarn ALL=(ALL)    ALL
```
####2.2.Slave
Masterのユーザー作り方と同じように、Slave１とSlave２にもhadoopyarnユーザを作ります。

#3.SSH接続の確認
※私のそのたの投稿【[SSH接続時パスワードなしでSSH接続の設定方法](https://qiita.com/gakuseikai/items/707a8f740db59a8c30ef)】を参照してください。

#4.Hosts設定の確認
####4.1.Master
Master上で、「/etc/hosts」ファイルの一番下に、以下の情報を追加します。
> 192.168.0.100 cluster-master
> 192.168.0.101 cluster-slave1
> 192.168.0.102 cluster-slave2

#4.2.Slave1 
Slave1上で、「/etc/hosts」ファイルの一番下に、以下の情報を追加します。
> 192.168.0.100 cluster-master
> 192.168.0.101 cluster-slave1

#4.3.Slave2
Slave2上で、「/etc/hosts」ファイルの一番下に、以下の情報を追加します。
> 192.168.0.100 cluster-master
> 192.168.0.102 cluster-slave2

#5.Sparkのインストール
####5.1.Master
以下のようにSparkのインストールを行います。

```
# sparkダウンロード
cd /usr/work
wget http://ftp.jaist.ac.jp/pub/apache/spark/spark-2.3.2/spark-2.3.2-bin-hadoop2.7.tgz
tar zxvf spark-2.3.2-bin-hadoop2.7.tgz
# 移動
sudo mv spark-2.3.2-bin-hadoop2.7 /usr/local/lib/spark-2.3.2-bin-hadoop2.7
cd /usr/local/lib/
sudo ln -s spark-2.3.2-bin-hadoop2.7 spark
```
「/etc/profile.d」の下に、「spark.sh」ファイルを作って、SPARK_HOMEなどの環境変数を設定します。

```
# spark.sh作成
cd /etc/profile.d
vi spark.sh
# 以下の変数を追加、保存
export SPARK_HOME=/usr/local/lib/spark
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
# 有効化
source spark.sh
```
#5.2.Slave
Master上のインストール方法と同じように、Slave１とSlave２にSparkをインストールします。

#6.Scalaのインストール
####6.1.Master
【[Scala公式サイト](https://www.scala-lang.org/download/2.11.7.html)】から、scala-2.11.7をダウンロードします。以下のようにScalaのインストールを行います。

```
# Scalaインストール
cd /usr/work
tar zxvf scala-2.11.7.tgz
# 移動
sudo mv scala-2.11.7 /usr/local/lib/ scala-2.11.7
cd /usr/local/lib/
sudo ln -s scala-2.11.7 scala
```
「/etc/profile.d」の下に、「scala.sh」ファイルを作って、SCALA_HOMEなどの環境変数を設定します。

```
# scala.sh作成
cd /etc/profile.d
vi scala.sh
# 以下の変数を追加、保存
export SCALA_HOME=/usr/local/lib/scala
export PATH=$SCALA_HOME/bin:$PATH 
# 有効化
source scala.sh
```
####6.2.Slave
Master上のインストール方法と同じように、Slave１とSlave２にScalaをインストールします。

#7.Hadoopのインストール
####7.1.Master
以下のようにHadoopのインストールを行います。

```
# hadoopダウンロード
cd /usr/work
wget http://ftp.jaist.ac.jp/pub/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
tar zxvf hadoop-2.7.7.tar.gz
# 移動
sudo mv hadoop-2.7.7 /usr/local/lib/hadoop-2.7.7
cd /usr/local/lib/
sudo ln -s hadoop-2.7.7.tar.gz hadoop
```
「/etc/profile.d」の下に、「hadoop.sh」ファイルを作って、HADOOP_HOMEなどの環境変数を設定します。

```
# hadoop.sh作成
cd /etc/profile.d
vi hadoop.sh
# 以下の変数を追加、保存
export HADOOP_HOME=/usr/local/lib/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=/usr/local/lib/hadoop
export YARN_CONF_DIR=$YARN_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH # 有効化
source hadoop.sh
```
####7.2.Slave
Master上のインストール方法と同じように、Slave１とSlave２にHadoopをインストールします。

#8.HadoopYarnクラスタの稼働に必要な環境変数の設定
####8.1.Master
「core-site.xml」ファイルにはHDFSのName nodeを記載します。従って「core-site.xml」ファイルに以下を追加します。
> &lt;configuration&gt;
>     &lt;property&gt;
>       &lt;name&gt;fs.defaultFS&lt;/name&gt;
>       &lt;value&gt;hdfs://192.168.0.100:9000&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;hadoop.tmp.dir&lt;/name&gt;
>        &lt;value&gt;file:/var/lib/hadoop/tmp&lt;/value&gt;
>    &lt;/property&gt;
> &lt;/configuration&gt;

「hdfs-site.xml」ファイルには、各ノードでNameNodeやDataNodeのデータ格納用に使うパスなどを記載します。パスはそれぞれのノードの役割に応じて指定します。従って「hdfs-site.xml」ファイルに以下を追加します。
> &lt;configuration&gt;
>     &lt;property&gt;
>         &lt;name&gt;dfs.namenode.secondary.http-address&lt;/name&gt;
>         &lt;value&gt;192.168.0.100:9001&lt;/value&gt;
>     &lt;/property&gt;
>     &lt;property&gt;
>         &lt;name&gt;dfs.namenode.name.dir&lt;/name&gt;
>         &lt;value&gt;file:/var/lib/hadoop/name&lt;/value&gt;
>     &lt;/property&gt;
>     &lt;property&gt;
>         &lt;name&gt;dfs.datanode.data.dir&lt;/name&gt;
>         &lt;value&gt;file:/var/lib/hadoop/data&lt;/value&gt;
>     &lt;/property&gt;
>     &lt;property&gt;
>         &lt;name&gt;dfs.replication&lt;/name&gt;
>         &lt;value&gt;1&lt;/value&gt;
>     &lt;/property&gt;
> &lt;/configuration&gt;

「mapred-site.xml」ファイルに、Yarnクラスタを使用しようことを指定します。
> &lt;configuration&gt;
>     &lt;property&gt;
>         &lt;name&gt;mapreduce.framework.name&lt;/name&gt;
>         &lt;value&gt;yarn&lt;/value&gt;
>     &lt;/property&gt;
> &lt;/configuration&gt;

「yarn-site.xml」ファイルには、YarnのリソースマネージャのIPアドレスの設定を記載します。従って「yarn-site.xml」ファイルに以下を追加します。
>&lt;configuration&gt;
>&lt;!-- Site specific YARN configuration properties --&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.nodemanager.aux-services&lt;/name&gt;
>        &lt;value&gt;mapreduce_shuffle&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.nodemanager.aux-services.mapreduce.shuffle.class&lt;/name&gt;
>        &lt;value&gt;org.apache.hadoop.mapred.ShuffleHandler&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.resourcemanager.address&lt;/name&gt;
>        &lt;value&gt;192.168.0.100:8032&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.resourcemanager.scheduler.address&lt;/name&gt;
>        &lt;value&gt;192.168.0.100:8030&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.resourcemanager.resource-tracker.address&lt;/name&gt;
>        &lt;value&gt;192.168.0.100:8035&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.resourcemanager.admin.address&lt;/name&gt;
>        &lt;value&gt;192.168.0.100:8033&lt;/value&gt;
>    &lt;/property&gt;
>    &lt;property&gt;
>        &lt;name&gt;yarn.resourcemanager.webapp.address&lt;/name&gt;
>        &lt;value&gt;192.168.0.100:8088&lt;/value&gt;
>    &lt;/property&gt;
>&lt;/configuration&gt;

「slaves」ファイルに、すべてのSlavaのIPアドレスを追加します。

> 192.168.0.100
> 192.168.0.101
> 192.168.0.102

####8.2.Slave
Master上の設定方法と同じように、Slave１とSlave２にも同じファイルを設定します。
#9.各ノードでHDFSに使用するディレクトリの作成
####9.1.Master
「hdfs-site.xml」の中の設定に応じて、それぞれのNameNode及びDataNodeに使用するディレクトリを作って、「hadoopyarn」ユーザで編集できるように設定します。

```
cd /var/lib/
# hadoopディレクトリ作成
sudo mkdir hadoop
sudo chown –R hadoopyarn ./hadoop 
sudo chgrp –R hadoopyarn ./hadoop 
sudo chmod –R 777 ./hadoop
# NameNode, DataNodeなどのディレクトリ作成
mkdir /var/lib/hadoop/name
mkdir /var/lib/hadoop/data
mkdir /var/lib/hadoop/tmp
```
####9.2.Slave
「hdfs-site.xml」の中の設定に応じて、DataNodeに使用するディレクトリを作成しております。

```
cd /var/lib/
# hadoopディレクトリ作成
sudo mkdir hadoop
sudo chown –R hadoopyarn ./hadoop 
sudo chgrp –R hadoopyarn ./hadoop 
sudo chmod –R 777 ./hadoop
# DataNodeなどのディレクトリ作成
mkdir /var/lib/hadoop/data
mkdir /var/lib/hadoop/tmp
#10.HDFSの起動と状態確認
Master側で、HDFSサービスを起動します。
# HDFS起動
start-dfs.sh
```
まず、「jps」コマンドでNameNodeとDataNodeの稼働状態を確認しておきます。

```
# Master側で、以下のコマンド入力
jps
# 以下の情報が表示されたらNameNodetとDataNodeが起動済
xxxxx NameNode 
xxxxx SecondaryNameNode 
xxxxx DataNode
```
Slave1とSlave2側で、それぞれのDataNodeの状態を確認します。

```
# Slave側で、以下のコマンド入力
jps
# 以下の情報が表示されたらDataNodeが起動済
xxxxx DataNode
```
次は、WebUIで、HDFSのDataNodeの台数も確認できます。
HDFSのWebUI【[http://192.168.0.100:50070](http://192.168.0.100:50070)】を開けます。画面の中から、「Datanodes」タブの「Datanode Infomation」の下に稼働中のSlave台数が確認できます。

#11.Yarnの起動と状態確認
Master側で、Yarnクラスターを起動します。

```
# YARN起動
start-yarn.sh
```
まず、「jps」コマンドでリソースマネージャとノードマネージャの稼働状態を確認しておきます。

```
# Master側で、以下のコマンド入力
jps
# 以下の情報が表示されたらYarnのリソースマネージャ、ノードマネージャが起動済
xxxxx NameNode 
xxxxx SecondaryNameNode 
xxxxx DataNode 
xxxxx ResourceManager 
xxxxx NodeManager
```
Slave1とSlave2側で、それぞれのノードマネージャの状態を確認します。

```
# Slave側で、以下のコマンド入力
jps
# 以下の情報が表示されたらノードマネージャが起動済
xxxxx DataNode
xxxxx NodeManager
```
次は、WebUIで、リソースマネージャ及び各ノードマネージャの稼働状況を確認しておきます。
HadoopのWebUI【[http://192.168.0.100:8088](http://192.168.0.100:8088)】を開けます。その画面の左のメニューから「Nodes」を選択して「Nodes of the cluster」画面が表示されます。その中に各稼働中ノードの情報が見れます。
 
#12.Yarnクラスタ上で稼働に必要なSpark設定
####12.1.Master
「spark-env.sh」ファイルに、以下の環境変数を設定します。

```
export SPARK_MASTER_IP=192.168.0.100
export SPARK_MASTER_HOST=cluster-master
export SPARK_MASTER_PORT=7077
export SPARK_LOCAL_DIRS=$SPARK_HOME
export SPARK_LOCAL_IP=192.168.0.100
export SPARK_LIBRARY_PATH=$CLASSPATH:$HADOOP_HOME/lib/native
```
「slaves.sh」ファイルに、全てのSlaveのIPアドレスを追加します。

> 192.168.0.100
> 192.168.0.101
> 192.168.0.102

####12.2.Slave
Masterで設定済の「spark-env.sh」、「slaves.sh」ファイルをSlave1とSlave２の同じのフォルダーにコピーしてください。

#13.WordCountアプリケーションの起動
####13.1.WordCountアプリケーションの実行
YarnのMaster側で、WordCountアプリケーションを実行します。

```
cd /usr/work
spark-submit --master yarn-cluster \
--jars ./spark-streaming-mqtt-assembly_2.11-1.6.3.jar \
--packages org.apache.bahir:spark-streaming-mqtt_2.11:2.2.1 \
./mqtt_wordcount.py tcp://192.168.0.99:1883 car
```
※権限に関連するエラーメッセージが表示したら、hadoopyarnユーザーに対して「/var/log/spark」フォルダーにR/W/X権限を付与してください。
####13.2.アプリケーションの稼働状態の確認
以下のようにコマンド確認ができます。

```
jps
# 以下の情報が表示されたら、WordCountが正常に起動済
xxxxx NameNode 
xxxxx SecondaryNameNode 
xxxxx DataNode 
xxxxx ResourceManager 
xxxxx NodeManager
xxxxx SparkSubimit
xxxxx ApplicationMaster
```
Hadoop画面の左のメニュー→「Running」→「RUNNING Applications」画面が表示されます。画面の真ん中にはWordCountアプリケーションが見れます。
WordCountアプリケーションIDを右クリックして、新しいタブで開いた画面には、選択したアプリケーションの詳細情報が表示されます。
詳細情報の真ん中の「ApplicationMaster」リンクを右クリックして、新しいタブで開いた画面には、WordCountのJobやStreamingの情報が確認できます。
 
#14.Yarnの停止
Yarnを停止したい場合は、Application、Yarn、Hdfsの順に各サービスを止めてください。

```
# WordCount停止
Ctrl + c
# Yarn停止
stop-yarn.sh
# HDFS停止
stop-dfs.sh
```