在網(wǎng)上找了很長(zhǎng)時(shí)間都沒有找到使用docker搭建hadoop分布式集群的文檔,沒辦法,只能自己寫一個(gè)了。
一:環(huán)境準(zhǔn)備:
1:首先要有一個(gè)centos7操作系統(tǒng),可以在虛擬機(jī)中安裝。
2:在centos7中安裝docker,docker的版本為1.8.2
安裝步驟如下:
<1>安裝制定版本的docker
1
|
yum install -y docker-1.8.2-10.el7.centos |
<2>安裝的時(shí)候可能會(huì)報(bào)錯(cuò),需要?jiǎng)h除這個(gè)依賴
1
|
rpm -e lvm2-7:2.02.105-14.el7.x86_64 |
啟動(dòng)docker
1
|
service docker start |
驗(yàn)證安裝結(jié)果:
<3>啟動(dòng)之后執(zhí)行docker info會(huì)看到下面有兩行警告信息
需要關(guān)閉防火墻并重啟系統(tǒng)
1
2
3
4
|
systemctl stop firewalld systemctl disable firewalld #注意:執(zhí)行完上面的命令之后需要重啟系統(tǒng) reboot -h(重啟系統(tǒng)) |
<4>運(yùn)行容器可能會(huì)報(bào)錯(cuò)
需要關(guān)閉selinux
解決方法:
1:setenforce 0(立刻生效,不需要重啟操作系統(tǒng))
2:修改/etc/selinux/config文件中的selinux=disabled ,然后重啟系統(tǒng)生效
建議兩個(gè)步驟都執(zhí)行,這樣可以確保系統(tǒng)重啟之后selinux也是關(guān)閉狀態(tài)
3:需要先構(gòu)建一個(gè)hadoop的基礎(chǔ)鏡像,使用dockerfile文件方式進(jìn)行構(gòu)建。
先構(gòu)建一個(gè)具備ssh功能的鏡像,方便后期使用。(但是這樣對(duì)于容器的安全性會(huì)有影響)
注意:這個(gè)鏡像中的root用戶的密碼是root
1
2
3
|
mkdir centos- ssh -root cd centos- ssh -root vi dockerfile |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 選擇一個(gè)已有的os鏡像作為基礎(chǔ) from centos # 鏡像的作者 maintainer crxy # 安裝openssh-server和sudo軟件包,并且將sshd的usepam參數(shù)設(shè)置成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 # 添加測(cè)試用戶root,密碼root,并且將此用戶添加到sudoers里 run echo "root:root" | chpasswd run echo "root all=(all) all" >> /etc/sudoers # 下面這兩句比較特殊,在centos6上必須要有,否則創(chuàng)建出來的容器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 # 啟動(dòng)sshd服務(wù)并且暴露22端口 run mkdir /var/run/sshd expose 22 cmd [ "/usr/sbin/sshd" , "-d" ] |
構(gòu)建命令:
1
|
docker build -t=”crxy /centos-ssh-root ” . |
查詢剛才構(gòu)建成功的鏡像
4:基于這個(gè)鏡像再構(gòu)建一個(gè)帶有jdk的鏡像
注意:jdk使用的是1.7版本的
1
2
3
4
|
mkdir centos- ssh -root-jdk cd centos- ssh -root-jdk cp .. /jdk-7u75-linux-x64 . tar .gz . vi dockerfile |
1
2
3
4
5
|
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 |
構(gòu)建命令:
1
|
docker build -t=”crxy /centos-ssh-root-jdk ” . |
查詢構(gòu)建成功的鏡像
5:基于這個(gè)jdk鏡像再構(gòu)建一個(gè)帶有hadoop的鏡像
注意:hadoop使用的是2.4.1版本的。
1
2
3
4
|
mkdir centos- ssh -root-jdk-hadoop cd centos- ssh -root-jdk-hadoop cp .. /hadoop-2 .4.1. tar .gz . vi dockerfile |
1
2
3
4
5
|
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 |
構(gòu)建命令:
1
|
docker build -t=”crxy /centos-ssh-root-jdk-hadoop ” . |
查詢構(gòu)建成功的鏡像
二:搭建hadoop分布式集群
1:集群規(guī)劃
準(zhǔn)備搭建一個(gè)具有三個(gè)節(jié)點(diǎn)的集群,一主兩從
主節(jié)點(diǎn):hadoop0 ip:192.168.2.10
從節(jié)點(diǎn)1:hadoop1 ip:192.168.2.11
從節(jié)點(diǎn)2:hadoop2 ip:192.168.2.12
但是由于docker容器重新啟動(dòng)之后ip會(huì)發(fā)生變化,所以需要我們給docker設(shè)置固定ip。使用pipework給docker容器設(shè)置固定ip
2:?jiǎn)?dòng)三個(gè)容器,分別作為hadoop0 hadoop1 hadoop2
在宿主機(jī)上執(zhí)行下面命令,給容器設(shè)置主機(jī)名和容器的名稱,并且在hadoop0中對(duì)外開放端口50070 和8088
1
2
3
4
5
|
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 查看剛才啟動(dòng)的是三個(gè)容器
3:給這三臺(tái)容器設(shè)置固定ip
1:下載pipework 下載地址:https://github.com/jpetazzo/pipework.git
2:把下載的zip包上傳到宿主機(jī)服務(wù)器上,解壓,改名字
1
2
3
|
unzip pipework-master.zip mv pipework-master pipework cp -rp pipework /pipework /usr/local/bin/ |
3:安裝bridge-utils
1
|
yum -y install bridge-utils |
4:創(chuàng)建網(wǎng)絡(luò)
1
2
3
|
brctl addbr br0 ip link set dev br0 up ip addr add 192.168.2.1 /24 dev br0 |
5:給容器設(shè)置固定ip
1
2
3
|
pipework br0 hadoop0 192.168.2.10 /24 pipework br0 hadoop1 192.168.2.11 /24 pipework br0 hadoop2 192.168.2.12 /24 |
驗(yàn)證一下,分別ping三個(gè)ip,能ping通就說明沒問題
4:配置hadoop集群
先連接到hadoop0上, 使用命令
1
|
docker exec -it hadoop0 /bin/bash |
下面的步驟就是hadoop集群的配置過程
1:設(shè)置主機(jī)名與ip的映射,修改三臺(tái)容器:vi /etc/hosts
添加下面配置
1
2
3
|
192.168.2.10 hadoop0 192.168.2.11 hadoop1 192.168.2.12 hadoop2 |
2:設(shè)置ssh免密碼登錄
在hadoop0上執(zhí)行下面操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
cd ~ mkdir . ssh cd . ssh ssh -keygen -t rsa(一直按回車即可) ssh -copy- id -i localhost ssh -copy- id -i hadoop0 ssh -copy- id -i hadoop1 ssh -copy- id -i hadoop2 在hadoop1上執(zhí)行下面操作 cd ~ cd . ssh ssh -keygen -t rsa(一直按回車即可) ssh -copy- id -i localhost ssh -copy- id -i hadoop1 在hadoop2上執(zhí)行下面操作 cd ~ cd . ssh ssh -keygen -t rsa(一直按回車即可) ssh -copy- id -i localhost ssh -copy- id -i hadoop2 |
3:在hadoop0上修改hadoop的配置文件
進(jìn)入到/usr/local/hadoop/etc/hadoop目錄
修改目錄下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
(1)hadoop-env.sh
1
|
export java_home= /usr/local/jdk1 .7 |
(2)core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
< 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
1
2
3
4
5
6
7
8
9
10
|
< configuration > < property > < name >dfs.replication</ name > < value >1</ value > </ property > < property > < name >dfs.permissions</ name > < value >false</ value > </ property > </ configuration > |
(4)yarn-site.xml
1
2
3
4
5
6
7
8
9
10
|
< 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
1
2
3
4
5
6
|
< configuration > < property > < name >mapreduce.framework.name</ name > < value >yarn</ value > </ property > </ configuration > |
(6)格式化
進(jìn)入到/usr/local/hadoop目錄下
1、執(zhí)行格式化命令
1
|
bin /hdfs namenode - format |
注意:在執(zhí)行的時(shí)候會(huì)報(bào)錯(cuò),是因?yàn)槿鄙賥hich命令,安裝即可
執(zhí)行下面命令安裝
1
|
yum install -y which |
看到下面命令說明格式化成功。
格式化操作不能重復(fù)執(zhí)行。如果一定要重復(fù)格式化,帶參數(shù)-force即可。
(7)啟動(dòng)偽分布hadoop
命令:
1
|
sbin /start-all .sh |
第一次啟動(dòng)的過程中需要輸入yes確認(rèn)一下。
使用jps,檢查進(jìn)程是否正常啟動(dòng)?能看到下面幾個(gè)進(jìn)程表示偽分布啟動(dòng)成功
1
2
3
4
5
6
7
|
[root@hadoop0 hadoop] # jps 3267 secondarynamenode 3003 namenode 3664 jps 3397 resourcemanager 3090 datanode 3487 nodemanager |
(8)停止偽分布hadoop
命令:
1
|
sbin /stop-all .sh |
(9)指定nodemanager的地址,修改文件yarn-site.xml
1
2
3
4
5
|
< property > < description >the hostname of the rm.</ description > < name >yarn.resourcemanager.hostname</ name > < value >hadoop0</ value > </ property > |
(10)修改hadoop0中hadoop的一個(gè)配置文件etc/hadoop/slaves
刪除原來的所有內(nèi)容,修改為如下
1
2
|
hadoop1 hadoop2 |
(11)在hadoop0中執(zhí)行命令
1
2
|
scp -rq /usr/local/hadoop hadoop1: /usr/local scp -rq /usr/local/hadoop hadoop2: /usr/local |
(12)啟動(dòng)hadoop分布式集群服務(wù)
執(zhí)行sbin/start-all.sh
注意:在執(zhí)行的時(shí)候會(huì)報(bào)錯(cuò),是因?yàn)閮蓚€(gè)從節(jié)點(diǎn)缺少which命令,安裝即可
分別在兩個(gè)從節(jié)點(diǎn)執(zhí)行下面命令安裝
1
|
yum install -y which |
再啟動(dòng)集群(如果集群已啟動(dòng),需要先停止)
1
|
sbin /start-all .sh |
(13)驗(yàn)證集群是否正常
首先查看進(jìn)程:
hadoop0上需要有這幾個(gè)進(jìn)程
1
2
3
4
5
|
[root@hadoop0 hadoop] # jps 4643 jps 4073 namenode 4216 secondarynamenode 4381 resourcemanager |
hadoop1上需要有這幾個(gè)進(jìn)程
1
2
3
4
|
[root@hadoop1 hadoop] # jps 715 nodemanager 849 jps 645 datanode |
hadoop2上需要有這幾個(gè)進(jìn)程
1
2
3
4
|
[root@hadoop2 hadoop] # jps 456 nodemanager 589 jps 388 datanode |
使用程序驗(yàn)證集群服務(wù)
創(chuàng)建一個(gè)本地文件
1
2
3
|
vi a.txt hello you hello me |
上傳a.txt到hdfs上
1
|
hdfs dfs -put a.txt / |
執(zhí)行wordcount程序
1
2
|
cd /usr/local/hadoop/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a .txt /out |
查看程序執(zhí)行結(jié)果
這樣就說明集群正常了。
通過瀏覽器訪問集群的服務(wù)
由于在啟動(dòng)hadoop0這個(gè)容器的時(shí)候把50070和8088映射到宿主機(jī)的對(duì)應(yīng)端口上了
adb9eba7142b crxy/centos-ssh-root-jdk-hadoop "/usr/sbin/sshd -d" about an hour ago up about an hour 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp hadoop0
所以在這可以直接通過宿主機(jī)訪問容器中hadoop集群的服務(wù)
宿主機(jī)的ip為:192.168.1.144
http://192.168.1.144:50070/
http://192.168.1.144:8088/
三:集群節(jié)點(diǎn)重啟
停止三個(gè)容器,在宿主機(jī)上執(zhí)行下面命令
1
2
3
|
docker stop hadoop0 docker stop hadoop1 docker stop hadoop2 |
容器停止之后,之前設(shè)置的固定ip也會(huì)消失,重新再使用這幾個(gè)容器的時(shí)候還需要重新設(shè)置固定ip
先把之前停止的三個(gè)容器起來
1
2
3
|
docker start hadoop0 docker start hadoop1 docker start hadoop2 |
在宿主機(jī)上執(zhí)行下面命令重新給容器設(shè)置固定ip
1
2
3
|
pipework br0 hadoop0 192.168.2.10 /24 pipework br0 hadoop1 192.168.2.11 /24 pipework br0 hadoop2 192.168.2.12 /24 |
還需要重新在容器中配置主機(jī)名和ip的映射關(guān)系,每次都手工寫比較麻煩
寫一個(gè)腳本,runhosts.sh
1
2
3
4
|
#!/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 |
添加執(zhí)行權(quán)限,
1
|
chmod +x runhosts.sh |
把這個(gè)腳本拷貝到所有節(jié)點(diǎn),并且分別執(zhí)行這個(gè)腳本
1
2
|
scp runhosts.sh hadoop1:~ scp runhosts.sh hadoop2:~ |
執(zhí)行腳本的命令
1
|
. /runhosts .sh |
查看/etc/hosts文件中是否添加成功
注意:有一些docker版本中不會(huì)在hosts文件中自動(dòng)生成下面這些映射,所以我們才在這里手工給容器設(shè)置固定ip,并設(shè)置主機(jī)名和ip的映射關(guān)系。
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
啟動(dòng)hadoop集群
1
|
sbin /start-all .sh |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/xu470438000/article/details/50512442