HDFS・YARNの擬似分散クラスタを構築する


## Outline

Hadoop２系のYARN上で色々なアプリを動かすことになったのでテスト環境を作ってみた。

色々資料を見ましたが、擬似分散モードでの環境構築はなんの説明もなしに書かれているものが多かったので、なるべく丁寧に記しておきます。

構築手法は、少し冗長ですが完全分散モードに寄せているので、擬似分散ならではの変な症状にはならないはず。。

## 環境

OS: Ubuntu14.04 （AWS EC2）
ユーザー: ubuntu
VPC: 特に設定なし。
IP: PublicIPとPrivateIPのどちらも使用。
Hadoop 2.5.2
port: 全開放（22, 80, 8020, 8032, 8088, 50070が開いてればたぶん大丈夫）

以降の操作はこのマシンにubuntuユーザーでssh接続した状態で進める。

### 役割

master
・NameNode
・ResourceManager
・DataNode
・NodeManager

それぞれのサービスの役割はこちらを参照。

http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

https://hadoop.apache.org/docs/r2.5.2/hadoop-yarn/hadoop-yarn-site/YARN.html

## 初期準備

Hadoopクラスタではsshで通信しあうので、自分自身に対してもパスワードでなく鍵での認証にする。

```bash:terminal
# PasswordAuthentication no　を確認
sudo vim /etc/ssh/sshd_config

# 鍵作成
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# 鍵を自身のリストに登録
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# 試しに自分にSSHしてみる。（PrivateID, localhost, 0.0.0.0などなんでもいい。）
ssh XXX.XXX.XXX.XXX
# 元に戻す。
exit

```


## 各種インストール

### Library

```bash:terminal
# java
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install oracle-java8-installer -y

# Hadoop
# めんどくさいのでHomeにそのまま置く
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/hadoop/common/hadoop-2.5.2/hadoop-2.5.2.tar.gz
tar zxvf hadoop-2.5.2.tar.gz
```

### 環境変数を設定する。

sudo vim /etc/profile

```bash:/etc/profile
# 末尾に追記する。
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/home/ubuntu/hadoop-2.5.2
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
```

```bash:terminal
# 適用する
source /etc/profile
```

重複するけど、こいつも読まれるので編集。
（既に初期値が入っているので上書きします。）

vim hadoop-2.5.2/etc/hadoop/hadoop-env.sh

```bash:hadoop-env.sh
# 既に初期値が入っているので上書きします。
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_CONF_DIR=/home/ubuntu/hadoop-2.5.2/etc/hadoop
```

## HDFS準備

### datanodeのディレクトリ用意

```bash:terminal
# datanodeの保存先を用意しておく。
mkdir -p myHadoop/data1
```

### core-site.xml

vim hadoop-2.5.2/etc/hadoop/core-site.xml

```xml:core-site.xml
<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://[PrivateIP]:8020</value>
	</property>
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/ubuntu/myHadoop/data1</value>
	</property>
</configuration>
```

項目の意味やデフォルト値はこちらを参照。
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/core-default.xml

### hdfs-site.xml

vim hadoop-2.5.2/etc/hadoop/hdfs-site.xml

```xml:hdfs-site.xml
<configuration>
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>
```

項目の意味やデフォルト値はこちらを参照。
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

### namenodeのformat

```bash:terminal
# 実行すると現状のnameNodeのデータは消えるので注意。
# 設定を変えて試したい時とかにリセット目的で使うとかしました。
hdfs namenode -format
```

### 起動

master

```bash:terminal

## namenode起動
hadoop-2.5.2/sbin/hadoop-daemon.sh start namenode

## dataNode起動
hadoop-2.5.2/sbin/hadoop-daemon.sh start datanode
```

### 確認

#### terminalから

```bash:terminal
# datanode, namenodeがあればOK。
jps
```

#### WebUIから

http://PublicIP:50070/
DataNodeタブで、一つデータノードが登録されていることを確認

### 停止（必要があれば）

```bash:terminal
hadoop-2.5.2/sbin/hadoop-daemon.sh stop namenode
hadoop-2.5.2/sbin/hadoop-daemon.sh stop datanode
```


## YARN準備

vim hadoop-2.5.2/etc/hadoop/yarn-site.xml

```xml:yarn-site.xml
<configuration>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>[PrivateIP]</value>
	</property>
</configuration>
```

項目の意味やデフォルト値はこちらを参照。
http://hadoop.apache.org/docs/r2.5.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

### 起動

master

```bash:terminal
## resource Manager起動
hadoop-2.5.2/sbin/yarn-daemon.sh start resourcemanager

## NodeManager起動
hadoop-2.5.2/sbin/yarn-daemon.sh start nodemanager
```

### 確認

#### terminalから

```bash:terminal
# ResourceManager, NodeManagerがあればOK
jps
```

#### WebUIから

http://[PublicIP]:8088/

nodesで一つ登録されていることを確認

### 停止（必要があれば）

```bash:terminal
hadoop-2.5.2/sbin/yarn-daemon.sh stop resourcemanager
hadoop-2.5.2/sbin/yarn-daemon.sh stop nodemanager
```

## クライアントからの動作確認

別記事にて記載。

## ハマったポイントとか

### 起動に失敗した時にログが便りにならない。
何が原因で失敗したのかのログはどこかに出力されてるんだろうか？

### ホストの設定をlocalhostにすると、clientから（PublicIPから）繋げない。。。

`netstat -antu`とかで見ると、localhostからのアクセスしか受け付けないようになってた。。

fsDefaultをlocalhostにするとつなげない。