最近要在公司里搭建一個hadoop測試集群,于是采用docker來快速部署hadoop集群。
0. 寫在前面
網(wǎng)上也已經(jīng)有很多教程了,但是其中都有不少坑,在此記錄一下自己安裝的過程。
目標:使用docker搭建一個一主兩從三臺機器的hadoop2.7.7版本的集群
準備:
首先要有一臺內(nèi)存8G以上的centos7機器,我用的是阿里云主機。
其次將jdk和hadoop包上傳到服務(wù)器中。
我安裝的是hadoop2.7.7。包給大家準備好了,鏈接:https://pan.baidu.com/s/15n_W-1rqOd2cUzhfvbkH4g 提取碼:vmzw。
1. 步驟
大致分以下幾步:
- 安裝docker
- 基礎(chǔ)環(huán)境準備
- 配置網(wǎng)絡(luò),并啟動docker容器
- 配置host及ssh免密登錄
- 安裝配置hadoop
1.1 安裝docker
依次執(zhí)行如下步驟安裝docker。如果有docker環(huán)境的可以跳過。
1
2
3
4
5
6
7
8
9
10
11
|
yum update yum install - y yum - utils device - mapper - persistent - data lvm2 yum - config - manager - - add - repo http: / / mirrors.aliyun.com / docker - ce / linux / centos / docker - ce.repo yum install - y docker - ce systemctl start docker docker - v |
1.2 基礎(chǔ)環(huán)境準備
1.2.1 創(chuàng)建基礎(chǔ)的centos7鏡像拉取官方centos7鏡像
1
|
docker pull centos |
通過build Dockfile生成帶ssh功能的centos鏡像
創(chuàng)建Dockerfile文件
1
|
vi Dockerfile |
將如下內(nèi)容寫入Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
FROM centos MAINTAINER mwf RUN yum install -y openssh-server sudo RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config RUN yum install -y openssh-clients RUN echo "root:qwe123" | chpasswd RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers RUN ssh -keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh -keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN mkdir /var/run/sshd EXPOSE 22 CMD [ "/usr/sbin/sshd" , "-D" ] |
上述內(nèi)容大概意思是:以centos鏡像為基礎(chǔ),設(shè)置密碼為wqe123,安裝ssh服務(wù)并啟動
構(gòu)建Dockerfile
1
|
docker build -t= "centos7-ssh" . |
將生成一個名為centos7-ssh
的鏡像,可以通過docker images
查看
1.2.2 生成有hadoop和jdk環(huán)境的鏡像
-
將準備好的包放在當(dāng)前目錄下。
hadoop-2.7.7.tar.gz
和jdk-8u202-linux-x64.tar.gz
- 通過build Dockfile生成帶hadoop和jdk環(huán)境的centos鏡像
剛才已經(jīng)創(chuàng)建了一個Dockerfile了,先將他移開。mv Dockerfile Dockerfile.bak
創(chuàng)建Dockerfile
1
|
vi Dockerfile |
將以下內(nèi)容寫入:
1
2
3
4
5
6
7
8
9
10
11
12
|
FROM centos7- ssh ADD jdk-8u202-linux-x64. tar .gz /usr/local/ RUN mv /usr/local/jdk1 .8.0_202 /usr/local/jdk1 .8 ENV JAVA_HOME /usr/local/jdk1 .8 ENV PATH $JAVA_HOME /bin :$PATH ADD hadoop-2.7.7. tar .gz /usr/local RUN mv /usr/local/hadoop-2 .7.7 /usr/local/hadoop ENV HADOOP_HOME /usr/local/hadoop ENV PATH $HADOOP_HOME /bin :$PATH RUN yum install -y which sudo |
上述內(nèi)容大概意思是:以上面生成的centos7-ssh為基礎(chǔ),將hadoop和jdk包放進去,然后配好環(huán)境變量。
構(gòu)建Dockerfile
1
|
docker build -t= "hadoop" . |
將生成一個名為hadoop的鏡像
1.3 配置網(wǎng)絡(luò),并啟動docker容器
因為集群間必須要能網(wǎng)絡(luò)連通,所以要先配置好網(wǎng)絡(luò)。
創(chuàng)建網(wǎng)絡(luò)
1
|
docker network create --driver bridge hadoop-br |
以上命令創(chuàng)建了一個名為hadoop-br
的bridge類型的網(wǎng)絡(luò)
啟動docker時指定網(wǎng)絡(luò)
1
2
3
|
docker run -itd --network hadoop-br --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop docker run -itd --network hadoop-br --name hadoop2 hadoop docker run -itd --network hadoop-br --name hadoop3 hadoop |
以上命令啟動了3臺機器,網(wǎng)絡(luò)都指定為hadoop-br
,hadoop1還開啟了端口映射。
查看網(wǎng)絡(luò)情況
1
|
docker network inspect hadoop-br |
執(zhí)行以上命令就可以看到對應(yīng)的網(wǎng)絡(luò)信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[ { "Name" : "hadoop-br" , "Id" : "88b7839f412a140462b87a353769e8091e92b5451c47b5c6e7b44a1879bc7c9a" , "Containers" : { "86e52eb15351114d45fdad4462cc2050c05202554849bedb8702822945268631" : { "Name" : "hadoop1" , "IPv4Address" : "172.18.0.2/16" , "IPv6Address" : "" }, "9baa1ff183f557f180da2b7af8366759a0d70834f43d6b60fba2e64f340e0558" : { "Name" : "hadoop2" , "IPv4Address" : "172.18.0.3/16" , "IPv6Address" : "" }, "e18a3166e965a81d28b4fe5168d1f0c3df1cb9f7e0cbe0673864779b224c8a7f" : { "Name" : "hadoop3" , "IPv4Address" : "172.18.0.4/16" , "IPv6Address" : "" } }, } ] |
我們可以得知3臺機器對應(yīng)的ip:
1
2
3
|
172.18.0.2 hadoop1 172.18.0.3 hadoop2 172.18.0.4 hadoop3 |
登錄docker容器,互相之間就可以ping通了。
1
2
3
|
docker exec -it hadoop1 bash docker exec -it hadoop2 bash docker exec -it hadoop3 bash |
1.4 配置host及ssh免密登錄
1.4.1 配置host
分別在每臺修改每臺機器的host
1
|
vi /etc/hosts |
將以下內(nèi)容寫入(注:docker分出來的ip對于每個人可能不一樣,填你自己的):
1
2
3
|
172.18.0.2 hadoop1 172.18.0.3 hadoop2 172.18.0.4 hadoop3 |
1.4.2 ssh免密登錄
因為上面在鏡像中已經(jīng)安裝了ssh服務(wù),所以直接分別在每臺機器上執(zhí)行以下命令:
1
2
3
4
5
6
7
8
|
ssh -keygen 一路回車 ssh -copy- id -i /root/ . ssh /id_rsa -p 22 root@hadoop1 輸入密碼,如果按我的來得話就是qwe123 ssh -copy- id -i /root/ . ssh /id_rsa -p 22 root@hadoop2 輸入密碼,如果按我的來得話就是qwe123 ssh -copy- id -i /root/ . ssh /id_rsa -p 22 root@hadoop3 輸入密碼,如果按我的來得話就是qwe123 |
1.4.3 測試是否配置成功
1
2
3
4
5
6
|
ping hadoop1 ping hadoop2 ping hadoop3 ssh hadoop1 ssh hadoop2 ssh hadoop3 |
1.5 安裝配置hadoop
1.5.1 在hadoop1上操作
進入hadoop1
1
|
docker exec -it hadoop1 bash |
創(chuàng)建一些文件夾,一會在配置中要用到
1
2
|
mkdir /home/hadoop mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data |
切換到hadoop配置的目錄
1
|
cd $HADOOP_HOME /etc/hadoop/ |
編輯core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<property> <name>fs.defaultFS< /name > <value>hdfs: //hadoop1 :9000< /value > < /property > <property> <name>hadoop.tmp. dir < /name > <value> file : /home/hadoop/tmp < /value > < /property > <property> <name>io. file .buffer.size< /name > <value>131702< /value > < /property > |
編輯hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<property> <name>dfs.namenode.name. dir < /name > <value> file : /home/hadoop/hdfs_name < /value > < /property > <property> <name>dfs.datanode.data. dir < /name > <value> file : /home/hadoop/hdfs_data < /value > < /property > <property> <name>dfs.replication< /name > <value>2< /value > < /property > <property> <name>dfs.namenode.secondary.http-address< /name > <value>hadoop1:9001< /value > < /property > <property> <name>dfs.webhdfs.enabled< /name > <value> true < /value > < /property > |
編輯mapred-site.xml
mapred-site.xml默認不存在,要執(zhí)行cp mapred-site.xml.template mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<property> <name>mapreduce.framework.name< /name > <value>yarn< /value > < /property > <property> <name>mapreduce.jobhistory.address< /name > <value>hadoop1:10020< /value > < /property > <property> <name>mapreduce.jobhistory.webapp.address< /name > <value>hadoop1:19888< /value > < /property > |
編輯yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<property> <name>yarn.nodemanager.aux-services< /name > <value>mapreduce_shuffle< /value > < /property > <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class< /name > <value>org.apache.hadoop.mapred.ShuffleHandler< /value > < /property > <property> <name>yarn.resourcemanager.address< /name > <value>hadoop1:8032< /value > < /property > <property> <name>yarn.resourcemanager.scheduler.address< /name > <value>hadoop1:8030< /value > < /property > <property> <name>yarn.resourcemanager.resource-tracker.address< /name > <value>hadoop1:8031< /value > < /property > <property> <name>yarn.resourcemanager.admin.address< /name > <value>hadoop1:8033< /value > < /property > <property> <name>yarn.resourcemanager.webapp.address< /name > <value>hadoop1:8088< /value > < /property > |
編輯slaves
我這里把hadoop1當(dāng)成主節(jié)點,hadoop2、3作為從節(jié)點
1
2
|
hadoop2 hadoop3 |
把文件拷貝到hadoop2和hadoop3上
依次執(zhí)行以下命令:
1
2
3
4
5
|
scp -r $HADOOP_HOME/ hadoop2: /usr/local/ scp -r $HADOOP_HOME/ hadoop3: /usr/local/ scp -r /home/hadoop hadoop2:/ scp -r /home/hadoop hadoop3:/ |
1.5.2 在每臺機器上操作
分別連接每臺機器
1
2
3
|
docker exec -it hadoop1 bash docker exec -it hadoop2 bash docker exec -it hadoop3 bash |
配置hadoop sbin目錄的環(huán)境變量
因為hadoop bin目錄在之前創(chuàng)建鏡像時就配好了,但是sbin目錄沒有配,所以要單獨配置。分配為每臺機器配置:
1
|
vi ~/.bashrc |
追加如下內(nèi)容:
1
|
export PATH=$PATH:$HADOOP_HOME /sbin |
執(zhí)行:
1
|
source ~/.bashrc |
1.5.3 啟動hadoop
在hadoop1上執(zhí)行以下命令:
格式化hdfs
1
|
hdfs namenode - format |
一鍵啟動
1
|
start-all.sh |
不出錯的話,就可以慶祝一下了。出錯的話,加油。
1.6 測試使用hadoopjps
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# hadoop1 1748 Jps 490 NameNode 846 ResourceManager 686 SecondaryNameNode # hadoop2 400 DataNode 721 Jps 509 NodeManager # hadoop3 425 NodeManager 316 DataNode 591 Jps |
上傳文件
1
2
3
4
5
6
7
8
9
|
hdfs dfs - mkdir /mwf echo hello > a.txt hdfs dfs -put a.txt /mwf hdfs dfs - ls /mwf Found 1 items drwxr-xr-x - root supergroup 0 2020-09-04 11:14 /mwf |
由于是云服務(wù)器,不想配端口,就不看ui界面了。
2. 最后
以上是我安裝成功之后總結(jié)的過程,應(yīng)該沒有問題,也可能有遺漏。
3. 參考
https://cloud.tencent.com/developer/article/1084166
https://cloud.tencent.com/developer/article/1084157?from=10680
https://blog.csdn.net/ifenggege/article/details/108396249
到此這篇關(guān)于使用docker部署hadoop集群的詳細教程的文章就介紹到這了,更多相關(guān)docker部署hadoop集群內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/upupfeng/p/13616125.html