使用Docker的Hadoop
问题
Docker 上で Hadoop を構築する。
技巧
SequenceIQ の提供する Apache Hadoop Docker image を活用する。
只需要一個選項:前提。
対象バージョンApache Hadoop Docker image2.7.1
Content (in Chinese): 内容
1. 建立主节点(资源管理器+名称节点)
- マスタノード用の Apache Hadoop Docker image を起動する。
$ docker run -itd -p 8088:8088 -p 9000:9000 -p 19888:19888 -p 50070:50070 -h hadoop-00 --name hadoop-00 sequenceiq/hadoop-docker /bin/bash
$ docker exec hadoop-00 service sshd start
- マスタノードの Hadoop 設定を編集する。
--- a/core-site.xml
+++ b/core-site.xml
@@ -1,6 +1,6 @@
<configuration>
<property>
<name>fs.defaultFS</name>
- <value>hdfs://localhost:9000</value>
+ <value>hdfs://hadoop-00:9000</value>
</property>
</configuration>
--- a/yarn-site.xml
+++ b/yarn-site.xml
@@ -29,4 +29,16 @@
<value>600</value>
</property>
+ <property>
+ <name>yarn.resourcemanager.address</name>
+ <value>hadoop-00:8032</value>
+ </property>
+ <property>
+ <name>yarn.resourcemanager.resource-tracker.address</name>
+ <value>hadoop-00:8031</value>
+ </property>
+ <property>
+ <name>yarn.resourcemanager.scheduler.address</name>
+ <value>hadoop-00:8030</value>
+ </property>
</configuration>
--- a/hdfs-site.xml
+++ b/hdfs-site.xml
@@ -3,4 +3,8 @@
<name>dfs.replication</name>
<value>1</value>
</property>
+ <property>
+ <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
+ <value>false</value>
+ </property>
</configuration>
--- a/mapred-site.xml
+++ b/mapred-site.xml
@@ -3,4 +3,8 @@
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
+ <property>
+ <name>mapreduce.jobhistory.address</name>
+ <value>hadoop-00:10020</value>
+ </property>
</configuration>
--- a/slaves
+++ b/slaves
@@ -1 +0,0 @@
-localhost
- マスタノードの HDFS データを削除する。
$ docker exec hadoop-00 rm -rf /tmp/hadoop-root/dfs/data/current
- マスターノードのデーモンを起動する。
$ docker exec hadoop-00 /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
$ docker exec hadoop-00 /usr/local/hadoop/sbin/hadoop-daemon.sh start namenode
$ docker exec hadoop-00 sh -c "USER=root /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver"
2. 建立从节点(NodeManager + DataNode)。
- スレーブノード用の Apache Hadoop Docker image を起動する。
$ docker run -itd -p 50010:50010 -h hadoop-01 --name hadoop-01 sequenceiq/hadoop-docker /bin/bash
$ docker exec hadoop-01 service sshd start
- マスタノードの /etc/hosts にスレーブノードを追加する。
$ docker exec hadoop-00 sh -c "echo $(docker inspect --format {{.NetworkSettings.IPAddress}} hadoop-01) hadoop-01 >> /etc/hosts"
- マスタノードの /usr/local/hadoop/etc/hadoop/slaves にスレーブノードを追加する。
$ docker exec hadoop-00 sh -c "echo hadoop-01 >> /usr/local/hadoop/etc/hadoop/slaves"
- スレーブノードの /etc/hosts をマスタノードと同期する。
$ docker exec hadoop-00 scp /etc/hosts hadoop-01:/etc/hosts
- スレーブノードの Hadoop 設定をマスタノードと同期する。
$ docker exec hadoop-00 rsync -av /usr/local/hadoop/etc/hadoop/ hadoop-01:/usr/local/hadoop/etc/hadoop/
- スレーブノードのデーモンを起動する。
$ docker exec hadoop-01 /usr/local/hadoop/sbin/yarn-daemon.sh start nodemanager
$ docker exec hadoop-01 /usr/local/hadoop/sbin/hadoop-daemon.sh start datanode
构建客户端
- クライアント用の Apache Hadoop Docker image を起動する。
$ docker run -itd -h hadoop-cli --name hadoop-cli sequenceiq/hadoop-docker /bin/bash
- クライアントの /etc/hosts にマスタノードを追加する。
$ docker exec hadoop-cli sh -c "echo $(docker inspect --format {{.NetworkSettings.IPAddress}} hadoop-00) hadoop-00 >> /etc/hosts"
- クライアントのHadoopの設定をマスタノードと同期する。
$ docker exec hadoop-cli rsync -av hadoop-00:/usr/local/hadoop/etc/hadoop/ /usr/local/hadoop/etc/hadoop/
4. 检查操作是否正确
- Hadoop のサンプルを実行する。
$ docker exec hadoop-cli /usr/local/hadoop/bin/hdfs dfs -rm -r output
$ docker exec hadoop-cli /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar grep input output 'dfs[a-z.]+'
- 実行結果
$ docker exec hadoop-cli /usr/local/hadoop/bin/hdfs dfs -cat output/*
6 dfs.audit.logger
4 dfs.class
3 dfs.server.namenode.
2 dfs.period
2 dfs.audit.log.maxfilesize
2 dfs.audit.log.maxbackupindex
1 dfsmetrics.log
1 dfsadmin
1 dfs.servers
1 dfs.replication
1 dfs.file
添加从节点(NodeManager+DataNode)。
- スレーブノード用の Apache Hadoop Docker image を起動する。
$ docker run -itd -h hadoop-02 --name hadoop-02 sequenceiq/hadoop-docker /bin/bash
$ docker exec hadoop-02 service sshd start
- マスタノードの /etc/hosts にスレーブノードを追加する。
$ docker exec hadoop-00 sh -c "echo $(docker inspect --format {{.NetworkSettings.IPAddress}} hadoop-02) hadoop-02 >> /etc/hosts"
- マスタノードの /usr/local/hadoop/etc/hadoop/slaves にスレーブノードを追加する。
$ docker exec hadoop-00 sh -c "echo hadoop-02 >> /usr/local/hadoop/etc/hadoop/slaves"
- スレーブノードの /etc/hosts をマスタノードと同期する。
$ docker exec hadoop-00 scp /etc/hosts hadoop-01:/etc/hosts
$ docker exec hadoop-00 scp /etc/hosts hadoop-02:/etc/hosts
- スレーブノードの Hadoop 設定をマスタノードと同期する。
$ docker exec hadoop-00 rsync -av /usr/local/hadoop/etc/hadoop/ hadoop-01:/usr/local/hadoop/etc/hadoop/
$ docker exec hadoop-00 rsync -av /usr/local/hadoop/etc/hadoop/ hadoop-02:/usr/local/hadoop/etc/hadoop/
- スレーブノードの HDFS データを削除する。
$ docker exec hadoop-02 rm -rf /tmp/hadoop-root/dfs/data/current
- スレーブノードのデーモンを起動する。
$ docker exec hadoop-02 /usr/local/hadoop/sbin/yarn-daemon.sh start nodemanager
$ docker exec hadoop-02 /usr/local/hadoop/sbin/hadoop-daemon.sh start datanode
请参考
-
- Apache Hadoop YARN
-
- HDFS Architecture
-
- Hadoop Cluster Setup
-
- Apache Hadoop 2.7.1 Docker image
- Apache Yarn 2.7.1 cluster Docker image