1.1. 启用 WSL 与虚拟机平台
1.1.1. 启用功能
1.2 安装 Docker Desktop
最新版本链接:Docker Desktop: The #1 Containerization Tool for Developers | Docker
指定版本链接:Docker Desktop release notes | Docker Docs
(1)安装好 Docker Desktop,接受相关协议后,进入主界面。如果有 docker hub 帐户就用帐户登录,否则就选没有帐号继续即可。
(2)测试 Docker Desktop 是否安装成功?可以在命令行或终端中输入命令:
sh
docker -v
# 或者
docker info
1.3. Docker 常用设置
(1)镜像源设置
这里找的是阿里云的镜像源,链接:容器镜像服务 (aliyun.com)
进入 Docker Desktop 主界面 → 设置(Settings) → Docker 引擎(Docker Engine)
添加如下内容:
json
"registry-mirrors": ["https://ib71hsz9.mirror.aliyuncs.com"]
如图所示:
(2) 修改 Docker Desktop 分发存储路径
先查看所有已安装的 Windows Subsystem for Linux (WSL) 发行版的详细列表
sh
wsl --list --all -v
而 Docker Desktop 默认将所有的 WSL2 分发所对应的 vhdx 硬盘映像文件存到路径:C:\Users\用户名\AppData\Local\Docker 下。为了数据安全性及 重用性,一般将上述文件迁移到其它硬盘中。 最新的 Docker Desktop 已支持在设置界面中直接修改 "Resources->Disk image location",应用并重新启动即可。如下图所示:
执行后,应该可以看到在新的目标文件夹中有 data 与 main 两个子文件夹, 里面分别存放 Docker Desktop 系统及数据。 后面如果重新安装系统或者重新安装了 Docker Desktop,只要保留这两个目 录下的文件,则原来的所有配置及数据都可以还原。可按如下步骤进行:
查看当前分发命令为:
sh
wsl -l --all -v
停止并注销分发(注意,关闭 Docker Desktop 管理端)命令为:
sh
wsl -t docker-desktop
wsl --unregister docker-desktop
wsl -t docker-desktop-data
wsl --unregister docker-desktop-data
导入分发令为:
sh
wsl --import-in-place docker-desktop-data D:\WSL\DockerDesktopWSL\data\ext4.vhdx
wsl --import-in-place docker-desktop D:\WSL\DockerDesktopWSL\main\ext4.vhdx
重新打开 Docker Desktop 管理端
1.4. 基本镜像制作
为了减少重复工作,可以将集群存储与计算环境中的常用组件全部安装好, 并提交到 Docker Server 中,后续容器在些镜像上创建。
(1) 创建网络
不管是分布式存储还是分布式计算,集群的搭建必须保证在同一个网络中, 让集群内的所有计算机都可以相互访问。为此,我们通过 docker 单独创建一个集群网络,后续所有容器都在这个网络中运行。 查看当前网络命令:
sh
docker network ls
类似结果:
sh
NETWORK ID NAME DRIVER SCOPE
3a6370a8f8eb bridge bridge local
583559d99159 host host local
80f6ea320f3b none null local
创建集群网络命令:
sh
docker network create -d bridge cluster
其中参数 -d bridge
表示连接方式为网桥,cluster
表示网络名称
查看网络信息命令:
sh
docker network inspect cluster
(2) 搜索镜像
sh
docker search debian
(3) 拉取镜像
sh
docker pull debian
如果拉取失败可能是镜像源问题,尝试其他镜像源。
1.5. 制作镜像(跳过)
(1)Dockerfile 操作指令
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD ["要运行的程序","参数1","参数2"] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
COPY 源文件/目录目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
VOLUME ["目录"] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径(类似cd) | 为后续的RUN、CMD、ENTRYPOINT指定工作自录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
1.6. 创建容器
(1)创建网桥
sh
docker network create hadoop
docker network ls
(2)创建容器
sh
docker run -itd --name hadoop102 --network hadoop -p 8088:8088 -p 50070:50070 debian
参数说明:--name
,表示容器名称;--network
表示使用的网络;-p
表示映射窗口,8088:8088 表示将容器中的 8088 端口映射到主机的 8088 端口;debian
,表示创建容器时使用的镜像名,也可镜像 ID(docker image list
查看);
如果之前创建失败过会出现容器已存在,这时候使用 docker rm
把他删了重新创建就好了
(3)查看容器
sh
docker ps
(4)查看网桥
sh
docker network inspect hadoop
1.7. 进入容器搭建集群
1.7.1. 登录容器
1)如果容器已经关闭,重新启动一下
sh
docker start hadoop102
进入容器。
sh
docker exec -it hadoop102 bash
表示以交互的方式附加到正在运行的容器,并执行容器中命令:bash
2)给 root 设置密码
sh
passwd root
1.7.2. 安装软件
在安装基本软件后,可以 Debian 的软件源切换到国内,以提高后续软件安装的速度,减少等待时间,提高效率。下面以阿里云为例,地理位置也可切换为其它的源,例如腾讯,华为,清华。
sh
# 1. 更新系统
apt update
# 2. 安装网络工具
apt install -y net-tools
# 3. 安装 ping
apt install -y iputils-ping
# 4. 安装 vim 工具
apt install -y vim
# 5. 安装 ssh
yum install -y openssh
apt install -y openssh-server
apt install -y openssh-client
# 6. 安装 https 组件
apt install -y apt-transport-https
# 7. 安装 rsync
apt install -y rsync
【可选】更换软件源,以阿里云为例
备份原文件
sh
cd /etc/apt
mv sources.list sources.list.bak
编辑源配置文件命令为:
sh
vim sources.list
在该文件的最上面加入如下内容:
deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
更新软件库清单
sh
apt-get update
apt-get upgrade
1.7.3. 搭建集群
安装 JDK 和 Hadoop
1)在容器中创建安装包目录
sh
mkdir /opt/software
mkdir /opt/module
在本地主机上执行,将 JDK 压缩包复制到 Docker 容器中
shell
# docker cp /本地主机路径/JDK 包 容器 ID:/opt/software/
docker cp jdk-8u144-linux-x64.tar.gz f889ba1fb3d2:/opt/software/
docker cp hadoop-3.3.1.tar.gz f889ba1fb3d2:/opt/software/
2)在容器中解压 JDK 压缩包
sh
tar -zxvf /opt/software/jdk-8u144-linux-x64.tar.gz -C /opt/module/
tar -zxvf /opt/software/hadoop-3.3.1.tar.gz -C /opt/module/
更改文件夹名称
sh
cd /opt/module/
mv jdk1.8.0_144 jdk
3)配置环境变量
sh
vim /etc/profile
在末尾添加内容如下:
sh
export JAVA_HOME=/opt/module/jdk
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/opt/module/hadoop-3.3.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使环境变量立即生效
sh
source /etc/profile
检测是否配置成功(查看 Java 版本)
shell
java -version
sh
# output
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
4)创建 HDFS 工作目录和 LOG 目录
创建 HDFS 的 NN 和 DN 工作主目录,创建 Hadoop 的 log 日志文件目录(建议将文件放在 /var
目录下,放别的地方也行)
shell
mkdir -p /var/big_data /var/log_hadoop
配置 Hadoop 集群环境
首先,进入$HADOOP_HOME/etc/hadoop
目录
shell
cd $HADOOP_HOME/etc/hadoop
1)为 Hadoop
提供 JAVA
解释器路径信息,主要目的是解决远程访问 hadoop
时候JAVA_HOME
无法继承的问题,同时将 Hadoop 的日志存储路径修改/var/log_hadoop
路径下,其默认在$HADOOP_HOME/etc/hadoop/logs
下,一般情况下建议重新指定路径。
shell
vim hadoop-env.sh
添加内容如下:(找到对应位置,没有就加在最后;命令模式下,输入 😒 回车,光标就会定位到最后一行,按 O 在下一行输入内容)
shell
export JAVA_HOME=/opt/module/jdk
export HADOOP_LOG_DIR=/var/log_hadoop
2)为 Yarn 任务、资源管理器提供 Java 运行环境
shell
vim yarn-env.sh
添加内容如下:
shell
export JAVA_HOME=/opt/module/jdk
3)配置 HDFS 主节点信息、持久化和数据文件的主目录
shell
vim core-site.xml
添加如下内容:
xml
<property>
<!-- 指定NameNode的地址 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<property>
<!-- 指定hadoop数据的存储目录 -->
<name>hadoop.tmp.dir</name>
<value>/var/big_data</value>
</property>
4)配置 HDFS 默认的数据存放策略
shell
vim hdfs-site.xml
添加如下内容:
xml
<property>
<!-- DataNode存储block的副本量,不大于DataNode的个数-->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!-- 2nn web端访问地址-->
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
<property>
<!-- 禁用 HDFS ACL(简单权限)-->
<name>dfs.permissions</name>
<value>false</value>
</property>
5)配置 Mapreduce 任务调度策略
shell
vim mapred-site.xml
添加如下内容:
xml
<property>
<!-- 指定MapReduce程序运行在Yarn上 -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!-- 历史服务器端地址 -->
<name>mapreduce.jobhistory.address</name>
<value>hadoop103:10020</value>
</property>
<property>
<!-- 历史服务器web端地址 -->
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop103:19888</value>
</property>
6)配置 YARN 资源管理角色的信息
shell
vim yarn-site.xml
添加如下内容:
xml
<property>
<!-- 指定MR走shuffle -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- 指定ResourceManager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
7)配置 DataNode 节点信息
shell
vim workers
添加如下内容(删除原有内容,不要留任何空格):
hadoop102
hadoop103
hadoop104
8)配置主机名对应 IP
shell
vim /etc/hosts
添加如下内容:
shell
172.19.0.2 hadoop102
172.19.0.3 hadoop103
172.19.0.4 hadoop104
9)退出容器,在本地主机上执行
保存镜像
sh
docker commit hadoop102 hadoop
克隆多个容器(以三台服务器集群为例)
sh
docker run -itd --name hadoop103 --network hadoop hadoop
docker run -itd --name hadoop104 --network hadoop hadoop
进入三台机子
sh
docker exec -it hadoop102 bash
docker exec -it hadoop103 bash
docker exec -it hadoop104 bash
配置 SSH 免密登录
1)免密登录原理,如下图所示
2)查看 ssh 服务状态(以下 ssh 有关所以命令均需在三台机器上执行)
sh
service ssh status
如果没有运行,使用以下命令启动它
sh
service ssh start
如果不是默认启动,设置SSH服务为开机自启:
sh
systemctl enable ssh
3)生成公钥和私钥,注意下面的指令要求3台机器都要执行,Mobaxterm
可以使用MultiExec
功能开启多执行模式,让三台机器同时执行。
sh
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
如果使用的是 root 用户,需要修改权限
sh
vim /etc/ssh/sshd_config
修改如下内容:
sh
PermitRootLogin yes
重新启动 ssh 服务
sh
service ssh restart
4)将公钥拷贝到要免密登录的目标机器上,各自文件下(不知道密码使用 passwd root
重新设置)
sh
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
.ssh文件夹下(~/.ssh)的文件功能解释
文件名 | 含义 |
---|---|
known_hosts | 记录ssh访问过计算机的公钥(public key) |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过得无密登录服务器公钥 |
1.7.4. 集群启停方式
1)各个模块分开启停(配置ssh是前提)
(1)如果集群是第一次启动 ,需要在 hadoop102 节点格式化 NameNode
shell
hdfs namenode -format
(2)整体启停 HDFS/YARN
shell
start-dfs.sh
stop-dfs.sh
start-yarn.sh
stop-yarn.sh
或者
shell
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/stop-dfs.sh
$HADOOP_HOME/etc/hadoop/sbin/start-yarn.sh
$HADOOP_HOME/etc/hadoop/sbin/stop-yarn.sh
如果使用的 hadoop
版本为 3.x
应该会出现在下述类型报错,显然是参数没有被定义
sh
Starting namenodes on [hadoop102]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop104]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operati
下面我们需要在定义这些参数
方法一: 在 /etc/profile
文件内配置参数
sh
vim /etc/profile
内容如下:
sh
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
方法二: 修改 start-dfs.sh
、stop-dfs.sh
、start-yarn.sh
、stop-yarn.sh
四个文件
修改 HDFS
文件
sh
vim $HADOOP_HOME/sbin/start-dfs.sh
vim $HADOOP_HOME/sbin/stop-dfs.sh
在顶部添加以下参数
sh
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
修改 YARN
文件
sh
vim $HADOOP_HOME/sbin/start-yarn.sh
vim $HADOOP_HOME/sbin/stop-yarn.sh
在顶部添加以下参数
sh
YARN_RESOURCEMANAGER_USER=root
HDFS_DATANODE_SECURE_USER=yarn
YARN_NODEMANAGER_USER=root
2)各个服务组件逐一启动/停止
(1)启停 HDFS 组件
shell
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启停 YARN
shell
yarn --daemon start/stop resourcemanager/nodemanager
(3)启停 JobHistory
shell
mr-jobhistory-daemon.sh start historyserver
mr-jobhistory-daemon.sh stop historyserver
3.x 版本的应该会出现下述警告
sh
WARNING: Use of this script to start the MR JobHistory daemon is deprecated.
WARNING: Attempting to execute replacement "mapred --daemon start" instead.
不想看到的话,可以改为使用下述命令
sh
mapred --daemon start historyserver
mapred --daemon stop historyserver
1.7.5. 编写集群常用脚本
集群启停脚本
shell
vim myhadoop.sh
添加内容如下:
shell
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo "=========== 启动 hadoop 集群 ==========="
echo "----------- 启动 hdfs -----------------"
ssh hadoop102 "$HADOOP_HOME/sbin/start-dfs.sh"
echo "----------- 启动 yarn -----------------"
ssh hadoop102 "$HADOOP_HOME/sbin/start-yarn.sh"
echo "----------- 启动 historyserver --------"
ssh hadoop103 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
;;
"stop")
echo "=========== 关闭 hadoop 集群 ==========="
echo "----------- 关闭 historyserver --------"
ssh hadoop103 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
echo "----------- 关闭 yarn -----------------"
ssh hadoop102 "$HADOOP_HOME/sbin/stop-yarn.sh"
echo "----------- 关闭 hdfs -----------------"
ssh hadoop102 "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
修改脚本执行权限
sh
chmod 777 myhadoop.sh
查看集群所有服务器进程脚本 jpsall
shell
vim jpsall
添加内容如下:
shell
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
修改脚本执行权限
sh
chmod 777 jpsall
集群分发脚本 xsync
在 /usr/local/bin
目录下创建 xsync 文件
sh
cd /usr/local/bin
vim xsync
添加内容如下:
sh
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for i in hadoop102 hadoop103 hadoop104
do
echo ------------------- $i --------------
rsync -rvl $pdir/$fname $user@$i:$pdir
done
修改脚本执行权限
sh
chmod 777 xsync
1.7.6. 脚本使用
1)启停 Hadoop 集群全部模块
shell
./myhadoop.sh start
./myhadoop.sh stop
2)查看 Hadoop 集群所有进程
shell
./jpsall
运行代码可以看到 hdfs,yarm,historyserver 三个模块全部启动
如果无法使用可能环境变量问题(把 /etc/profile
里的 java 环境变量添加到 ~/.bashrc
)
sh
vim ~/.bashrc
sh
source ~/.bashrc
查看三台机器所有进程:
hadoop102:NameNode,DataNode,ResourceManager,NodeManager,Jps
hadoop103:DataNode,NodeManager,JobHistoryServer,Jps
hadoop104:DataNode,SecondaryNameNode,NodeManager,Jps
3)分发文件
退回根目录,准备一个 test.txt 文件,
sh
xsync test.txt
在另外两个服务器的根目录下存在 test.txt 即分发成功。
备注
每次重启容器需要重新启动 ssh
服务,同时容器的 IP
与其启动顺序有关会出现不对应的情况,可以自行写一个 shell
文件每次启动完运行一下,例如:
sh
# 找到并打开文件/root/.bashrc
$ vim /root/.bashrc
# 在.bashrc末尾添加如下代码
$ service ssh start