English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

dockerを使ってhadoop分散クラスタを構築する詳細

DockerでHadoop分布式クラスタを構築・デプロイする

hadoop分布式クラスタをdockerで構築するためのドキュメントを見つけるのに時間がかかりました。どうしても見つからなかったので、自分で書くしかありませんでした。

一:環境準備:

1:まずCentosを持っておく必要があります。7オペレーティングシステム上で、仮想マシン内にインストールできます。

2:centos7centos上にdockerをインストールします。dockerのバージョンは、1.8.2

インストール手順は以下の通りです:

<1>指定されたバージョンのdockerをインストール 

yum install -y docker-1.8.2-10.el7.centos 

<2>インストール中にエラーが発生する可能性があります。この依存関係を削除する必要があります

rpm -e lvm2-7:2.02.105-14.el7.x86_64

dockerを起動

service docker start

インストール結果の確認:

 

<3>起動後、docker infoを実行すると以下の2行の警告情報が表示されます

ファイアウォールを关闭し、システムを再起動する必要があります

systemctl stop firewalld
systemctl disable firewalld
#注意:上記のコマンドを実行した後はシステムを再起動する必要があります
reboot -h(システムを再起動)

<4>コンテナを実行するとエラーが発生する可能性があります

selinuxを关闭する必要があります

解決策:

1:setenforce 0(即座に効果を発揮し、オペレーティングシステムの再起動は必要ありません)

2:変更/etc/selinux/configファイルのSELINUX=disabledに設定し、システムを再起動して効果を発揮させます。

両方のステップを実行することをお勧めします。これにより、システムが再起動した後にselinuxも关闭状態になります。

3hadoopの基本イメージを構築する必要があります。dockerfileファイルを使用して構築します。

まずssh機能を持つイメージを構築し、後期的使用に便利にします。(しかし、これによりコンテナのセキュリティに影響を与えます)

注意:このイメージ内のrootユーザーのパスワードはrootです

Mkdir centos-ssh-root 
Cd centos-ssh-root 
Vi Dockerfile
# 現存するosイメージを選択してベースとして使用します 
FROM centos 
# イメージの作者 
MAINTAINER crxy 
# opensshのインストール-serverおよびsudoパッケージをインストールし、sshdのUsePAMパラメータをnoに設定します 
RUN yum install -y openssh-server sudo 
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config 
# opensshのインストール-clients
RUN yum install -y openssh-clients
# テストユーザーrootを追加し、パスワードをrootに設定し、sudoersにこのユーザーを追加します 
RUN echo "root:root" | chpasswd 
RUN echo "root  ALL=(ALL)    ALL" >> /etc/sudoers 
# 以下の二行は特別です、centos6上には必ず必要で、そうでないと作成されたコンテナのsshdがログインできない 
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key 
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 
# sshdサービスを起動し、ポートを公開します22ポート 
RUN mkdir /var/run/sshd 
EXPOSE 22 
CMD ["/usr/sbin/sshd", "-D"]

構築コマンド:

docker build -t=crxy/centos-ssh-root” .

先ほど構築した成功したイメージを検索します

 

4:このイメージに基づいてjdkを含むイメージを構築します
注意:jdkを使用しているのは1.7バージョンの

Mkdir centos-ssh-root-jdk 
Cd centos-ssh-root-jdk 
Cp ../jdk-7u75-Linux-x64.tar.gz . 
Vi Dockerfile
FROM crxy/centos-ssh-root
ADD jdk-7u75-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
ENV JAVA_HOME /usr/local/jdk1.7
ENV PATH $JAVA_HOME/bin:$PATH

構築コマンド:

docker build -t=crxy/centos-ssh-root-jdk” .

ビルドが成功したイメージを確認

 

5:このjdkイメージに基づいてhadoopを含むイメージを構築します

注意:hadoopを使用しているのは2.4.1バージョンの。

Mkdir centos-ssh-root-jdk-hadoop 
Cd centos-ssh-root-jdk-hadoop 
Cp ../hadoop-2.4.1.tar.gz . 
Vi Dockerfile
FROM crxy/centos-ssh-root-jdk
ADD hadoop-2.4.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

構築コマンド:

docker build -t=crxy/centos-ssh-root-jdk-hadoop” .

ビルドが成功したイメージを確認

二:hadoop分散クラスターの構築

1:クラスターの計画

3つのノードを持つクラスターを構築する準備をしています、1つのマスターと2つのサブマスター

のマスター:hadoop0 ip:192.168.2.10

のノード1:hadoop1 ip:192.168.2.11

のノード2:hadoop2 ip:192.168.2.12

しかし、dockerコンテナが再起動するとIPが変更されるため、dockerに固定IPを設定する必要があります。pipeworkを使用してdockerコンテナに固定IPを設定

2:3つのコンテナを起動し、それぞれhadoop0 hadoopとして使用1 hadoop2

ホストマシン上で以下のコマンドを実行し、コンテナにホスト名とコンテナの名前を設定し、hadoop0で外部にポートを公開50070 と8088

docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop
docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop
docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop

docker psを使用して、先ほど起動した3つのコンテナを確認

3:これら3つのコンテナに固定IPを設定

1:pipeworkのダウンロード先:https://github.com/jpetazzo/pipework.git

2:ダウンロードしたzipファイルをホストマシンサーバーにアップロードし、解凍、名前を変更

unzip pipework-master.zip
mv pipework-master pipework
cp -rp pipework/pipework /usr/local/bin/ 

3:bridgeのインストール-utils

yum -y install bridge-utils

4:ネットワークの作成

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0

5:コンテナに固定IPを設定

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

確認してください、3つのIPにpingを送信し、pingが通ったら問題ありません

4:hadoopクラスターの設定

まずhadoop0に接続し、コマンドを使用して

docker exec -it hadoop0 /bin/bash

以下の手順はhadoopクラスターの設定プロセスです

1:ホスト名とIPのマッピングの設定、3つのコンテナをviで修正 /etc/hosts

以下の設定を追加

192.168.2.10  hadoop0
192.168.2.11  hadoop1
192.168.2.12  hadoop2

2:sshの無パスワードログインの設定

hadoop0上で以下の操作を実行

cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(常にEnterキーを押して)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
在hadoop1上で以下の操作を実行
cd ~
cd .ssh
ssh-keygen -t rsa(常にEnterキーを押して)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
在hadoop2上で以下の操作を実行
cd ~
cd .ssh
ssh-keygen -t rsa(常にEnterキーを押して)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3:hadoop0上修改hadoop的配置文件

に入ります/usr/local/hadoop/etc/hadoopディレクトリ

ディレクトリ下の設定ファイルcore-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

(1)hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.7

(2)core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs:<//hadoop0:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value>
    </property>
     <property>
         <name>fs.trash.interval</name>
         <value>1440</value>
    </property>
</configuration>

(3)hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
</configuration>

(4)yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property> 
        <name>yarn.log-aggregation-enable</name> 
        <value>true</value> 
    </property>
</configuration>

(5)ファイル名を変更:mv mapred-site.xml.template mapred-site.xml

vi mapred-site.xml

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

(6)フォーマット

に入ります/usr/local/hadoopディレクトリ下

1、フォーマットコマンドを実行します

bin/hdfs namenode -format

注意:実行中にエラーが表示される場合がありますが、whichコマンドが欠けているためインストールしてください

以下のコマンドを実行してインストールします

yum install -y which

以下のコマンドが表示されると、フォーマットが成功しました

フォーマット操作は繰り返し実行できません。もし強制的に繰り返しフォーマットする必要がある場合は、以下のパラメータで実行します-forceで済みます。

(7)仮分散hadoopを起動

コマンド:

sbin/start-all.sh

初回起動の際には、yesを入力して確認が必要です。

jpsを使用して、プロセスが正常に起動しているか確認します。以下のプロセスが見えると仮分散が成功しました

[root@hadoop0 hadoop]# jps
3267 SecondaryNameNode
3003 NameNode
3664 Jps
3397 ResourceManager
3090 DataNode
3487 NodeManager

(8)仮分散hadoopを停止

コマンド:

sbin/stop-all.sh

(9)指定nodemanagerのアドレス、ファイルyarn-site.xml

<property>
  <description>The hostname of the RM.</description>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop0</value>
 </property>

(10)修改hadoop0中hadoop的一个配置文件etc/hadoop/slaves

删除原来的所有内容,修改为如下

hadoop1
hadoop2

(11)在hadoop0中执行命令

 scp -rq /usr/local/hadoop  hadoop1:/usr/local
 scp -rq /usr/local/hadoop  hadoop2:/usr/local

(12)启动hadoop分布式集群服务

执行sbin/start-all.sh

注意:在执行的时候会报错,是因为两个从节点缺少which命令,安装即可

分别在两个从节点执行下面命令安装

yum install -y which

再启动集群(如果集群已启动,需要先停止)

sbin/start-all.sh

(13)验证集群是否正常

首先查看进程:

Hadoop0上需要有这几个进程

[root@hadoop0 hadoop]# jps
4643 Jps
4073 NameNode
4216 SecondaryNameNode
4381 ResourceManager

Hadoop1上需要有这几个进程

[root@hadoop1 hadoop]# jps
715 NodeManager
849 Jps
645 DataNode

Hadoop2上需要有这几个进程

[root@hadoop2 hadoop]# jps
456 NodeManager
589 Jps
388 DataNode

使用程序验证集群服务

创建一个本地文件

vi a.txt
hello you
hello me

上传a.txt到hdfs上

hdfs dfs -put a.txt /

执行wordcount程序

cd /usr/local/hadoop/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out

查看程序执行结果

 

这样就说明集群正常了。

通过浏览器访问集群的服务
由于在启动hadoop0这个容器的时候把50070和8088映射到宿主机的对应端口上了

adb9eba7142b    crxy/centos-ssh-root-jdk-hadoop  "/usr/sbin/sshd -D"  約一時間前  運行約一時間  0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp  hadoop0

所以在这可以直接通过宿主机访问容器中hadoop集群的服务
宿主机的ip为:192.168.1.144

http://192.168.1.144:50070/

http://192.168.1.144:8088/

三:集群节点重启

停止三个容器,在宿主机上执行下面命令

docker stop hadoop0
docker stop hadoop1
docker stop hadoop2

コンテナが停止すると、以前に設定した固定IPも消失します。これらのコンテナを使用する際には、再び固定IPを設定する必要があります。
まず、前に停止していた3つのコンテナを再起動します

docker start hadoop0
docker start hadoop1
docker start hadoop2

ホストマシン上で以下のコマンドを実行して、コンテナに固定IPを再設定します

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

また、コンテナ内でホスト名とIPのマッピング関係を再設定する必要があります。毎回手動で書くのは煩雑です。

スクリプトを書く、runhosts.sh

#!/bin/bash
echo 192.168.2.10    hadoop0 >> /etc/hosts
echo 192.168.2.11    hadoop1 >> /etc/hosts
echo 192.168.2.12    hadoop2 >> /etc/hosts

実行権限を追加する、

chmod +x runhosts.sh 

このスクリプトをすべてのノードにコピーし、それぞれのスクリプトを実行してください

scp runhosts.sh hadoop1:~
scp runhosts.sh hadoop2:~

スクリプトを実行するコマンド

./runhosts.sh

確認/etc/hostsファイルに成功して追加されましたか?

注意:一部のdockerバージョンでは、hostsファイルに自動的に以下のマッピングが生成されません。そのため、ここで手動でコンテナに固定IPを設定し、ホスト名とIPのマッピング関係を設定する必要があります。

172.17.0.25     hadoop0
172.17.0.25     hadoop0.bridge
172.17.0.26     hadoop1
172.17.0.26     hadoop1.bridge
172.17.0.27     hadoop2
172.17.0.27     hadoop2.bridge

hadoopクラスターの起動

sbin/start-all.sh

これで本文のすべての内容が終わりです。皆様の学習に役立つことを願っています。また、呐喊トレーニングのサポートを多くいただければ幸いです。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。本サイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害を疑う内容がある場合は、メールを送信してください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。告発を行い、関連する証拠を提供してください。一旦確認がとれましたら、本サイトは即座に侵害疑いのコンテンツを削除します。)

基本チュートリアル
おすすめ