English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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(メールを送信する際には、#を@に置き換えてください。告発を行い、関連する証拠を提供してください。一旦確認がとれましたら、本サイトは即座に侵害疑いのコンテンツを削除します。)