前言
搭建一个 Hadoop 集群需要起码三台以上的服务器,传统的使用 VMware 多开虚拟机的方式对内存的占用较多,对电脑的配置要求较高,起码要 8 核处理器外加 16 G的运行内存,否则开多个虚拟机再开 IDEA
非常容易卡死。
使用 Docker 的话就简单了,不用安装操作系统,直接下载镜像,这个镜像就相当于操作系统,然后基于这个镜像运行多个容器,就相当于开了多个虚拟机,且系统性能消耗要远小于虚拟机。
假设我们有一个 centos7 镜像,启动多个容器,每个容器都有一个IP,都能通过SSH连接操作,这样就可以在每个容器中安装 JAVA Hadoop,从而搭建起集群环境了。
使用 Docker 搭建 Hadoop 集群的具体步骤有:
- 安装Docker
- 获取centos镜像
- 安装SSH
- 为容器配置IP
- 安装JAVA和Hadoop
- 配置Hadoop
一、安装 Docker
Docker 支持 CentOS 6 及以后的版本。
CentOS 7 系统可以直接通过 yum 进行安装:
yum install -y docker
二、拉取镜像
我们首先先启动 docker
systemctl start docker
docker 启动后通过 docker pull centos
指令来获取 CentOS 镜像
运用 docker images
指令来查看镜像列表
三、创建容器并配置环境
接下来我们来创建一个名为 hadoop1 的容器,镜像源为 centos。
docker run --privileged=true --name=hadoop1 -p 9870:9870 -p 8020:8020 -p 9866:9866 -dit docker.io/centos /sbin/init
其中 :
--privileged=true
和 /sbin/init
表示特权启动,后面需要用到 systemctl 命令,需要由这个权限才可以没有上面这个,再使用时会报 PID 1 的错误。
-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口,我们需要用到 hadoop1 9870和8020端口,这俩个端口分别运行 hdfs 和 yarn 服务,9866 端口为读写数据端口。
-dit
表示交互式且后台运行,少了 -it
容器会自动停止
之后我们在宿主机中创建 /opt/module 与 /opt/software 目录,将 hadoop 与 jdk 压缩包上传至 /opt/software 路径下,并解压到 /opt/module 路径中。
之后将 jdk 和 hadoop 从主机复制到该容器中
docker cp /opt/module/jdk1.8.0_212 1c6155788cb5:/opt/module
docker cp /opt/module/hadoop-3.1.3 1c6155788cb5:/opt/module
docker cp
指令的语法为
docker cp hadoop路径 容器ID:容器路径
然后进入容器 docker exec -it 1c6155788cb5 /bin/bash
配置环境变量,在 /etc/profile.d/ 下创建文件 mydev.sh
:wq
保存退出后,使用 source /etc/profile
使配置生效
四、安装 ssh
我们需要让各个容器产生联系,才能构成集群,但默认情况下,容器并不能被其他容器直接通过 ssh 访问,所以这里需要配置。
首先需要设置密码
passwd root
大概率会提示没有该命令,就得下载它,然后再设置就好了
yum install passwd
然后下载 ssh,以下三步(安装了服务端和客户端)
yum install openssh
yum install openssh-server
yum install openssh-clients
然后检查配置文件,查看以下两个配置是否一样(默认应该都是这样的)
vim /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
这两个配置允许外网通过 ssh 连接该服务器(容器)
如果发现不是这样,就修改它,同时需要重启 ssh 是指生效
systemctl restart sshd
同样该命令可能不存在,就下载它
yum install initscripts
ifconfig 查看当前容器 IP,然后用 ssh 测试连通一下,如拒绝访问通过输入以下指令将 22 端口打开
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
五、保存镜像并进行克隆
首先要克隆出多个容器,就需要将该容器打包成镜像,再由该镜像创建出多个容器,步骤如下:
首先通过以下指令将容器保存为镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
然后我们利用新生成的镜像再创建容器
docker run --privileged=true --name=hadoop2 -p 8088:8088 -dit hadoop /sbin/init
docker run --privileged=true --name=hadoop3 -p 9868:9868 -dit hadoop /sbin/init
六、配置 IP
在这些容器生成好后,为它们配置一个 IP 地址映射,往后就不用去记住每一个容器的 IP 地址了。
但同时由于 docker 网桥模式的特性,当容器重启时,会按顺序为该容器分配一个 IP,使得该 IP 地址不是固定的会变化,这对我们已经做的映射非常不友好,所以接下来的第一步,是为每个容器固定一个 IP 地址(这里需要借助 pipework)。
1)安装 pipework (下载并复制可执行文件到 bin 目录)
git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
2) 安装 bridge-utils
yum -y install bridge-utils
3)创建网络(这里 IP 地址自定义)
brctl addbr br0
ip link set dev br0 up
ip addr add 172.16.10.1 dev br0
4)为各个容器设置固定的 IP
pipework br0 <容器名> IP/掩码,如:
pipework br0 hadoop1 172.16.10.10/24
pipework br0 hadoop2 172.16.10.11/24
pipework br0 hadoop3 172.16.10.12/24
5)测试这几个 IP 是否可用
ping 172.16.10.10
这样就成功地为每一个容器固定好 IP 地址了,接下来就可以在容器内配置映射了
1)在每一台容器中,修改 hosts 文件
vim /etc/hosts
比如说我的,就在文件中增加:
172.16.10.10 hadoop001
172.16.10.11 hadoop002
172.16.10.12 hadoop003
2)配置完毕后,我们就可以直接通过名字轻松连接各个容器了,如:
ssh hadoop003
剩下的免密登录、Hadoop 配置等,均与虚拟机中配置相同,详情见这篇文章
转载:https://blog.csdn.net/m0_51111980/article/details/125782120