hadoop cluster@docker container


・hadoopを1から勉強する為に、とりあえずコンテナ上に環境構築
・手間を省くためsequenceiq/hadoop-dockerを利用する
・下記構成で構築

| node name | 役割 |
|:---------:|:---------:|
| hadoop1   |Namenode/ResourceManager/datanode/NodeManager |
| hadoop2   |datanode/NodeManager|
| hadoop3   |datanode/NodeManager|



## コンテナイメージを入手

```
docker pull sequenceiq/hadoop-docker
```

## 1ノード目起動

```
docker run -it --name hadoop1 -h hadoop1 -p 50070:50070 -p 8088:8088 sequenceiq/hadoop-docker /etc/bootstrap.sh -bash
/
Starting sshd:                                             [  OK  ]
Starting namenodes on [hadoop1]
hadoop1: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-hadoop1.out
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-hadoop1.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-hadoop1.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn--resourcemanager-hadoop1.out
localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-hadoop1.out
bash-4.1# 

```

## 2ノード目起動

```
docker run -it --name hadoop2 -h hadoop2 sequenceiq/hadoop-docker /etc/bootstrap.sh -bash
```

## 3ノード目起動

```
docker run -it --name hadoop3 -h hadoop3 sequenceiq/hadoop-docker /etc/bootstrap.sh -bash
```


管理画面見ると自動ではクラスタにはならない。。。

## 停止
bootstrapで単体起動してるので、とりあえずそれぞれ落とす

```
$HADOOP_PREFIX/sbin/stop-all.sh
```


## hosts設定
それぞれのコンテナで各コンテナのIPを記述

```
vi /etc/hosts
172.17.0.2	hadoop1
172.17.0.3	hadoop2
172.17.0.4	hadoop3
```

## HDFS設定
以下、masterとなる1号機で実施

### データディレクトリ作成

```
mkdir -p /hdfs/data1
```

### core-site.xml修正
作成したディレクトリの記述を追記

```
vi /usr/local/hadoop/etc/hadoop/core-site.xml 
<configuration>
   <property>
      <name>fs.defaultFS</name>
      <value>hdfs://hadoop1:9000</value>
   </property>
   <property>
      <name>hadoop.tmp.dir</name>
      <value>/hdfs/data1</value>
   </property>
</configuration>
```

### mapred-site.xml修正
下記を追記

```
vi mapred-site.xml
    <name>mapred.job.tracker</name>
    <value>hadoop1:8021</value>
    <final>true</final>
  </property>
```


### yarn-site.xml修正
下記を追記

```
vi yarn-site.xml 
  <property>
   <name>yarn.resourcemanager.resource-tracker.address</name>
   <value>hadoop1:8031</value>
  </property>
```

### slave修正

```
vi slaves
hadoop1
hadoop2
hadoop3
```

### 2〜3ノード目にコピー
rsyncでコピー

```
rsync -av /usr/local/hadoop/etc/hadoop/ hadoop2:/usr/local/hadoop/etc/hadoop/

rsync -av /usr/local/hadoop/etc/hadoop/ hadoop3:/usr/local/hadoop/etc/hadoop/
```

### 初期化

```
$HADOOP_PREFIX/bin/hadoop namenode -format
```

## 起動
1号機で起動

```
$HADOOP_PREFIX/sbin/start-all.sh
```

## 起動確認
jpsコマンドで確認

node1

```
jps
218 NameNode
769 NodeManager
349 DataNode
663 ResourceManager
481 SecondaryNameNode
1089 Jps
```

node2〜3

```
jps
260 Jps
162 NodeManager
61 DataNode
```

## 起動確認＠WebUI
とりあえず、3台クラスタ構成で起動した

http://192.168.99.100:8088/cluster/nodes
![hadoop1.png](https://qiita-image-store.s3.amazonaws.com/0/59856/c9ce426d-9949-26ac-537b-7d9733196192.png "hadoop1.png")


http://192.168.99.100:50070/
![hadoop2.png](https://qiita-image-store.s3.amazonaws.com/0/59856/03ed9170-af6b-8795-538b-736e3c708c06.png "hadoop2.png")



## コンテナ再起動対応

### bootstrapコメントアウト
コンテナ再起動でコンフィグ初期化＆無駄に起動するので動かないようにする。

```
vi /etc/bootstrap.sh
#!/bin/bash

: ${HADOOP_PREFIX:=/usr/local/hadoop}

$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh

rm /tmp/*.pid

# installing libraries if any - (resource urls added comma separated to the ACP system variable)
cd $HADOOP_PREFIX/share/hadoop/common ; for cp in ${ACP//,/ }; do  echo == $cp; curl -LO $cp ; done; cd -

# altering the core-site configuration
#sed s/HOSTNAME/$HOSTNAME/ /usr/local/hadoop/etc/hadoop/core-site.xml.template > /usr/local/hadoop/etc/hadoop/core-site.xml


service sshd start
#$HADOOP_PREFIX/sbin/start-dfs.sh
#$HADOOP_PREFIX/sbin/start-yarn.sh

if [[ $1 == "-d" ]]; then
  while true; do sleep 1000; done
fi

if [[ $1 == "-bash" ]]; then
  /bin/bash
fi
```

あとはhostsが毎回初期化される&IP変わるからどーしよ。。
一応コンテナ再起動後、hosts書き換えてnode1でstart-all.sh 叩けばクラスタ状態で起動する。