・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
コンテナ再起動対応
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 叩けばクラスタ状態で起動する。