參考:
基于 Docker 搭建 Hadoop 平臺(tái)_不思故亡的博客-CSDN博客_docker搭建hadoop
使用docker部署hadoop集群 - upupfeng - 博客園 (cnblogs.com)
hadoop 啟動(dòng)dfs失敗- Q1Zhen - 博客園 (cnblogs.com)
基于docker的hadoop集群搭建小何又沐風(fēng)的博客-CSDN博客基于docker搭建hadoop
Hadoop集群添加、刪除節(jié)點(diǎn)_oToyix的博客-CSDN博客_hadoop集群添加節(jié)點(diǎn)
一飘庄、集群規(guī)劃
主機(jī)名 | IP | 用戶 | HDFS | YARN |
---|---|---|---|---|
hadoop0 | 待定 | root | NameNode振坚、DataNode | ResourceManager 、NodeManager |
hadoop1 | 待定 | root | SecondaryNameNode蔬将、DataNode | NodeManager |
hadoop2 | 待定 | root | DataNode | NodeManager |
二爷速、環(huán)境準(zhǔn)備
1、Docker( for Windows)環(huán)境(docker也可以裝在wsl2里面)霞怀,請(qǐng)自行搭建
2惫东、jdk-8u333-linux-x64.tar.gz - JDK 官方下載頁(yè)面
3、hadoop-3.3.3.tar.gz - hadoop 3.3.3官方下載
三毙石、構(gòu)建centos-hadoop鏡像
1廉沮、創(chuàng)建Dockerfile文件,并將其和下載的壓縮包放一起
2徐矩、編寫(xiě)Dockerfile滞时,內(nèi)容如下
FROM centos:centos7.9.2009
# 使用centos7版本就好,不要使用centos8
MAINTAINER sksum@qq.com
# 安裝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
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"]
# 將JDK包添加到鏡像之中力喷,并配置環(huán)境變量
ADD jdk-8u333-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_333 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
# 將hadoop包添加到鏡像之中刽漂,并配置環(huán)境變量
ADD hadoop-3.3.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-3.3.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
ENV PATH $HADOOP_HOME/sbin:$PATH
# 配置集群的角色,不然啟動(dòng)集群時(shí)會(huì)報(bào)錯(cuò)
ENV HDFS_NAMENODE_USER="root"
ENV HDFS_DATANODE_USER="root"
ENV HDFS_SECONDARYNAMENODE_USER="root"
ENV YARN_RESOURCEMANAGER_USER="root"
ENV YARN_NODEMANAGER_USER="root"
# 創(chuàng)建文件目錄弟孟,用于后面存放HDFS數(shù)據(jù)
RUN mkdir /home/hadoop
RUN mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
# 定義時(shí)區(qū)參數(shù)
ENV TZ=Asia/Shanghai
#設(shè)置時(shí)區(qū)
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
# 中文支持
RUN yum -y install kde-l10n-Chinese
RUN yum -y install glibc-common
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
# 設(shè)置編碼
ENV LC_ALL zh_CN.UTF-8
3贝咙、打包鏡像,起名為 centos-hadoop
docker build -t centos-hadoop ./
打包成功后可以使用命令docker images
檢查鏡像是否生成
四拂募、創(chuàng)建hadoop容器
1庭猩、 搭建子網(wǎng)絡(luò),以便子容器(集群)能相互通訊
docker network create --subnet=192.168.1.0/24 hadoopnet
2陈症、 創(chuàng)建hadoop容器蔼水,并分配網(wǎng)絡(luò)
# 主服務(wù)器hadoop0端口映射到宿主機(jī),映射8088端口录肯、9870端口趴腋、9864端口
docker run -itd --name hadoop0 --hostname hadoop0 --net hadoopnet --ip 192.168.1.2 -p 8088:8088 -p 9870:9870 -p 9864:9864 centos-hadoop
docker run -itd --name hadoop1 --hostname hadoop1 --net hadoopnet --ip 192.168.1.3 centos-hadoop
docker run -itd --name hadoop2 --hostname hadoop2 --net hadoopnet --ip 192.168.1.4 centos-hadoop
3、使用docker ps
命令查看創(chuàng)建的3個(gè)容器
五、配置ssh免密登錄
1优炬、進(jìn)入主服務(wù)器(主節(jié)點(diǎn))颁井,以下操作在主要服務(wù)器操作即可
docker exec -it hadoop0 /bin/bash
2、配置ssh免密登錄
ssh-keygen
#剩下的一路回車(chē)即可
# 以下3條都不能省蠢护,請(qǐng)根據(jù)提示輸入yes以及主機(jī)密碼雅宾,開(kāi)頭我們?cè)O(shè)置的是root/root
ssh-copy-id hadoop0
ssh-copy-id hadoop1
ssh-copy-id hadoop2
六、配置hadoop集群
1葵硕、進(jìn)入hadoop的文件配置目錄(也是在主節(jié)點(diǎn)服務(wù)器中操作)眉抬,主要修改以下配置文件:
cd $HADOOP_HOME/etc/hadoop
配置文件名 | 配置內(nèi)容 | 配置對(duì)象 |
---|---|---|
core-site.xml | 集群全局參數(shù) | 用于定義系統(tǒng)級(jí)別的參數(shù), 如HDFS URL懈凹、Hadoop的臨時(shí)目錄等 |
hdfs-site.xml | HDFS參數(shù) | 如名稱節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)的存放位置蜀变、 文件副本的個(gè)數(shù)、文件讀取權(quán)限等 |
mapred-site.xml | Mapreduce參數(shù) | 包括JobHistory Server和應(yīng)用程序參數(shù)蘸劈, 如reduce任務(wù)的默認(rèn)個(gè)數(shù)、 任務(wù)所能夠使用內(nèi)存的默認(rèn)上下限等 |
yarn-site.xml | 集群資源管理系統(tǒng)參數(shù) | 配置 ResourceManager尊沸, NodeManager 的通信端口威沫, web監(jiān)控端口等 |
workers | 集群 DataNode節(jié)點(diǎn)的主機(jī)名或IP | 集群 DataNode節(jié)點(diǎn)的主機(jī)名或IP, 以便于start-all.sh啟動(dòng)集群的節(jié)點(diǎn) |
1洼专、vi hadoop-env.sh
棒掠,添加如下配置(此步驟可忽略,其在打包鏡像時(shí)已配置環(huán)境變量)
export JAVA_HOME=/usr/local/jdk1.8
2屁商、 vi core-site.xml
<configuration>
<!-- 定義主服務(wù)器的URI和端口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop0:9000</value>
</property>
<!-- 設(shè)置hadoop本地?cái)?shù)據(jù)存儲(chǔ)路徑 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<!-- HDFS垃圾箱設(shè)置烟很,可以恢復(fù)誤刪除,分鐘數(shù)蜡镶,0為禁用雾袱,添加該項(xiàng)無(wú)需重啟hadoop -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>
2、vi hdfs-site.xml
<configuration>
<!-- 保存FsImage鏡像的目錄官还,作用是存放hadoop的名稱節(jié)點(diǎn)namenode里的metadata -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hdfs_name</value>
</property>
<!-- 存放HDFS文件系統(tǒng)數(shù)據(jù)文件的目錄芹橡,作用是存放hadoop的數(shù)據(jù)節(jié)點(diǎn)datanode里的多個(gè)數(shù)據(jù)塊 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hdfs_data</value>
</property>
<!-- hdfs數(shù)據(jù)塊的復(fù)制份數(shù),默認(rèn)3望伦,理論上份數(shù)越多跑數(shù)速度越快林说,但是需要的存儲(chǔ)空間也更多。有錢(qián)人可以調(diào)5或者6 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- SNN進(jìn)程運(yùn)行機(jī)器位置信息-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<!-- 是否開(kāi)啟webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
3屯伞、vi mapred-site.xml
<configuration>
<!-- 設(shè)置MR程序默認(rèn)運(yùn)行模式腿箩,YARN集群 local本地模式-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程序歷史服務(wù)地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop0:10020</value>
</property>
<!-- MR程序歷史服務(wù)器web地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop0:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
4、vi yarn-site.xml
<configuration>
<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>hadoop0:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop0:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop0:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop0:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop0:8088</value>
</property>
</configuration>
5劣摇、vi workers
配置的為 DataNode節(jié)點(diǎn)的主機(jī)名或IP(hadoop3.0以后slaves更名為workers)
hadoop0
hadoop1
hadoop2
# 刪掉 localhost
6珠移、將主節(jié)點(diǎn)服務(wù)器的配置文件同步給另外兩臺(tái)從服務(wù)器(還是在$HADOOP_HOME/etc/hadoop
目錄下執(zhí)行)
scp -r * hadoop1:$HADOOP_HOME/etc/hadoop
scp -r * hadoop2:$HADOOP_HOME/etc/hadoop
scp -r /home/hadoop hadoop1:/home/
scp -r /home/hadoop hadoop2:/home/
7、在主節(jié)點(diǎn)下(NameNode)格式化HDFS(首次使用,文件存儲(chǔ)系統(tǒng)要進(jìn)行格式化剑梳,在主服務(wù)器操作即可)
hdfs namenode -format
看到約倒數(shù)第十行提示信息唆貌,會(huì)提示初始化成功
INFO common.Storage: Storage directory /home/hadoop/hdfs_name has been successfully formatted.
補(bǔ)充:不要重復(fù)格式化HDFS,會(huì)導(dǎo)致DataNode無(wú)法啟動(dòng)垢乙。
8锨咙、使用命令 start-all.sh
啟動(dòng)HDFS 集群和YARN集群,此時(shí)日志如下:
[root@hadoop0 sbin]# start-all.sh
Starting namenodes on [hadoop0]
Last login: Mon May 30 06:43:27 UTC 2022 on pts/2
Starting datanodes
Last login: Mon May 30 06:51:35 UTC 2022 on pts/2
Starting secondary namenodes [hadoop1]
Last login: Mon May 30 06:51:37 UTC 2022 on pts/2
Starting resourcemanager
Last login: Mon May 30 06:51:40 UTC 2022 on pts/2
Starting nodemanagers
Last login: Mon May 30 06:51:45 UTC 2022 on pts/2
補(bǔ)充:HDFS 集群和YARN集群也可單獨(dú)啟動(dòng)追逮,啟動(dòng)命令都在$HADOOP_HOME/sbin
中酪刀,至此,Hadoop集群部署結(jié)束钮孵。
七骂倘、驗(yàn)證hadoop集群是否正常啟動(dòng)
方法1、可檢查各個(gè)容器巴席,通過(guò)命令jps
历涝,查看進(jìn)程是否正常啟動(dòng)
# 容器hadoop0(主節(jié)點(diǎn))
[root@hadoop0 sbin]# jps
4054 ResourceManager
3447 NameNode
3594 DataNode
4206 NodeManager
4815 Jps
# 容器hadoop1(從節(jié)點(diǎn))
[root@hadoop1 hdfs_data]# jps
709 DataNode
823 SecondaryNameNode
1129 Jps
909 NodeManager
# 容器hadoop2(從節(jié)點(diǎn))
[root@hadoop2 /]# jps
1730 Jps
1004 NodeManager
847 DataNode
如上所示,顯示已啟動(dòng)的進(jìn)程漾唉,與集群規(guī)劃中的一致荧库,各容器進(jìn)程啟動(dòng)正常。
2赵刑、測(cè)試hdfs是否可以正常上傳文件
# HDFS創(chuàng)建一個(gè)目錄
hdfs dfs -mkdir /test
# 容器內(nèi)創(chuàng)建一個(gè)文件
echo "hello hdfs" >> local.txt
# 將文件上傳到HDFS
hdfs dfs -put local.txt /test
# 查看HDFS 的test文件夾
hdfs dfs -ls /test
# Found 1 items
# -rw-r--r-- 2 root supergroup 11 2022-05-30 07:51 /test/local.txt
# 查看文件內(nèi)容
hdfs dfs -cat /test/local.txt
# hello hdfs
3分衫、檢查web界面是否能夠正常打開(kāi)(前面創(chuàng)建容器時(shí),有將這端口映射到宿主機(jī)端口)
Yarn集群監(jiān)控界面:http://localhost:8088/
HDFS集群監(jiān)控界面: http://localhost:9870/
4蚪战、mapReduce服務(wù)測(cè)試
4.1 進(jìn)入hadoop計(jì)算樣例目錄
cd $HADOOP_HOME/share/hadoop/mapreduce
4.2 運(yùn)行測(cè)試樣例 hadoop jar hadoop-mapreduce-examples-3.3.3.jar pi 3 100
調(diào)用jar包計(jì)算pi的值,計(jì)算100次(根據(jù)自己的hadoop版本修改命令)
4.3通過(guò)瀏覽器查看铐懊,在瀏覽器中輸入localhost:8088邀桑,可以查看任務(wù)情況以及日志等
八、節(jié)點(diǎn)擴(kuò)容
1科乎、創(chuàng)建新的容器hadoop3
docker run -itd --name hadoop3 --hostname hadoop3 --net hadoopnet --ip 192.168.1.5 centos-hadoop
2概漱、進(jìn)入主節(jié)點(diǎn)容器
docker exec -it hadoop0 /bin/bash
3、配置免密登錄
ssh-copy-id hadoop3
4喜喂、修改主節(jié)點(diǎn)容器中的 DataNode節(jié)點(diǎn)配置文件瓤摧,新增從節(jié)點(diǎn)的hostname名稱
cd $HADOOP_HOME/etc/hadoop
vi workers
新增 hadoop3
或者直接
echo "hadoop3" >> $HADOOP_HOME/etc/hadoop/workers
5、將hadoop配置文件同步到新節(jié)點(diǎn)容器hadoop3(主要是步驟六那幾個(gè)xml文件)
cd $HADOOP_HOME/etc/hadoop
scp -r * hadoop3:$HADOOP_HOME/etc/hadoop
6玉吁、(新開(kāi)窗口)切換到hadoop3節(jié)點(diǎn)服務(wù)器照弥,啟動(dòng)datanode 和nodemanager進(jìn)程
docker exec -it hadoop3 /bin/bash
hdfs --daemon start datanode
yarn --daemon start nodemanager
# jps命令可以檢測(cè)進(jìn)程是否啟動(dòng)成功
7、切回主節(jié)點(diǎn)hadoop1服務(wù)器进副,動(dòng)態(tài)刷新集群節(jié)點(diǎn)这揣,并做資源重新分配悔常。
hdfs dfsadmin -refreshNodes
start-balancer.sh
8、通過(guò)網(wǎng)頁(yè)判斷節(jié)點(diǎn)是否新增成功
HDFS集群監(jiān)控界面:Namenode information
也可以在主節(jié)點(diǎn)服務(wù)器通過(guò)以下命令判斷節(jié)點(diǎn)是否新增成功
# 查看現(xiàn)有HDFS各節(jié)點(diǎn)狀態(tài)给赞,命令操作如下
hdfs dfsadmin -report
# 查看YARN各節(jié)點(diǎn)狀態(tài)机打,命令操作如下
yarn node -list
九、動(dòng)態(tài)刪除節(jié)點(diǎn)(未測(cè)試)
1片迅、 主節(jié)點(diǎn)配置hdfs-site.xml文件
# 進(jìn)入配置文件目錄
cd $HADOOP_HOME/etc/hadoop
# 編輯文件
vi hdfs-site.xml
2残邀、加入下面代碼,指定要?jiǎng)h除的節(jié)點(diǎn)配置文件
<property>
<name>dfs.hosts.exclude</name>
<value>${HADOOP_HOME}/etc/hadoop/excludes</value>
</property>
3柑蛇、編輯上面步驟指定的配置文件芥挣,將要?jiǎng)h除的節(jié)點(diǎn)名稱添加到文件里面
echo hadoop3 >> ${HADOOP_HOME}/etc/hadoop/excludes
4、修改了hadoop的配置文件耻台,就得將配置文件同步給其他節(jié)點(diǎn)
scp -r * hadoop1:$HADOOP_HOME/etc/hadoop
scp -r * hadoop2:$HADOOP_HOME/etc/hadoop
scp -r * hadoop3:$HADOOP_HOME/etc/hadoop
5空免、刷新主節(jié)點(diǎn)
hdfs dfsadmin -refreshNodes
start-balancer.sh
6、查看HDFS各節(jié)點(diǎn)狀態(tài)
hdfs dfsadmin -report
十盆耽、補(bǔ)充說(shuō)明
上述教程 docker 是安裝在Windows系統(tǒng)蹋砚,雖然正常搭建起來(lái)了hadoop集群,也能正常使用摄杂。但是有一個(gè)問(wèn)題存在坝咐,那就是宿主機(jī)(Windows)無(wú)法訪問(wèn)docker容器的IP(只能通過(guò)端口映射到宿主機(jī)),這點(diǎn)讓我覺(jué)得很無(wú)法忍受(因?yàn)槲液竺孢€要擴(kuò)容容器安裝其他軟件)匙姜。因此我又在windows的linux子系統(tǒng)(Windows Subsystem for Linux, 簡(jiǎn)稱WSL)上安裝了docker畅厢,并按照上面教程重新成功的搭建了hadoop集群冯痢。下面補(bǔ)充docker安裝WSL2上的個(gè)別問(wèn)題氮昧。
1、window 訪問(wèn)linux系統(tǒng)上的docker容器IP方式浦楣。
# 在Windows系統(tǒng)的管理員終端袖肥,給路由列表中永久添加一條靜態(tài)路由
route -p add 192.168.1.0/24 mask 255.255.240.0 172.22.65.131
# 其中192.168.1.0/24是docker的容器使用bridge網(wǎng)絡(luò),詳見(jiàn)前面步驟四振劳、1椎组,
# 172.22.65.131 是linux網(wǎng)卡的ip,如下圖
# window添加完靜態(tài)路由后历恐,window就可以ping得通docker容器了,可測(cè)試如下
# ping 192.168.1.2
2、windows重啟后弱贼,WSL2的IP出現(xiàn)變化問(wèn)題蒸苇。
這問(wèn)題沒(méi)有直接的解決方式(其他方案不少)∷甭茫考慮到這個(gè)hadoop集群搭建的性質(zhì)只是用于學(xué)習(xí)溪烤,建議每次重啟WSL2后,在windows里面管理員終端重新添加下靜態(tài)路由
# WSL2下查詢linux ip
$(ifconfig eth0 | grep -w inet | awk '{print $2}')
# WSL2下關(guān)閉防火墻(坑,每次重啟后都需要關(guān)閉防火墻)
sudo ufw disable
# 開(kāi)啟防火墻
# sudo ufw enable
# 檢查防火墻狀態(tài)
# sudo ufw status
補(bǔ)充:有個(gè)很奇怪的問(wèn)題檬嘀,wsl2重啟前槽驶,明明已經(jīng)關(guān)閉了防火墻了,重啟后檢查防火墻狀態(tài)時(shí)提示的也是防火墻沒(méi)激活鸳兽。
但是windows(宿主機(jī))卻ping不通docker容器的ip(僅可以ping通wsl2)掂铐,此時(shí)再關(guān)閉一次防火墻就好了。
# windows終端下刪除老的靜態(tài)路由
route delete 192.168.1.0
# 為當(dāng)前Windows系統(tǒng)路由列表中永久添加一條靜態(tài)路由
route -p add 192.168.1.0/24 mask 255.255.240.0 172.22.65.131
# 記得用前面查詢出來(lái)的 ip 贸铜,代替掉172.22.65.131
3堡纬、其他可能用得上的命令
# 檢查docker是否運(yùn)行
service docker status
# 運(yùn)行docker
sudo service docker start
# 啟動(dòng)容器hadoop0
docker start hadoop0
# 進(jìn)入容器hadoop0
docker exec -it hadoop0 /bin/bash
# 啟動(dòng)hadoop集群(記得要把另外幾個(gè)容器也啟動(dòng)起來(lái))
start-all.sh