使用 Docker 搭建 Hadoop 集群

1.1. 启用 WSL 与虚拟机平台

1.1.1. 启用功能

启用 WSL并使用 Moba 连接-CSDN博客

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.shstop-dfs.shstart-yarn.shstop-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
相关推荐
熟透的蜗牛2 小时前
大数据技术-Hadoop(二)HDFS的介绍与使用
大数据·hadoop·hdfs
Dusk_橙子4 小时前
在K8S中,nodePort的externalTrafficPolicy字段有什么作用?
云原生·容器·kubernetes
努力的小T5 小时前
Debian操作系统相对于Ubuntu有什么优势吗?
linux·运维·服务器·ubuntu·centos·云计算·debian
毒丐5 小时前
Debian系软件管理工具命令大全
linux·运维·debian
墨尔本、晴8 小时前
[Hive]七 Hive 内核
数据仓库·hive·hadoop
dessler9 小时前
Dokcer-Dockerfile案例(二)
linux·运维·docker
FF在路上9 小时前
Docker应用-项目部署及DockerCompose
运维·docker·容器
久绊A10 小时前
Windows Subsystem for Linux (WSL)
linux·服务器·windows·wsl·子系统
小陈far12 小时前
Docker中的MYSQL导入本地SQL语句
sql·mysql·docker
m0_7482563413 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
大数据·hadoop·架构