本文参考博主-寒冰晓撤-的博文,在此基础上搭建hadoop环境,在她的基础上做了一些补充
网上的教程一般是在自己的电脑上安装一台虚拟机,然后载入CentOS环境,为满足集群化 的效果,于是克隆出三台虚拟机如果你的电脑内存不够大,可以考虑租一台云服务器,在云服务器上安装docker,然后再拉取CentOS环境,将此环境镜像,再克隆出两个容器,同样也能达到三台虚拟机的效果。
本文将详细介绍整个配置过程以及分析配置过程中会将遇到的问题。
报错:Repository epel is listed more than once in the configuration
原因:CentOS 8操作系统版本结束了生命周期(EOL),Linux社区已不再维护该操作系统版本。建议您切换到Anolis或Alinux。
如果您的业务过渡期仍需要使用CentOS 8系统中的一些安装包,请根据下文切换CentOS 8的源。
方案:
[root@56f295723fa1 yum.repos.d]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
[root@56f295723fa1 yum.repos.d]# yum update -y
docker:用于开发、交互和运行应用程序交互的平台。
首先查看云服务器上有无安装Docker环境,你可以将之前的docker卸载
① cat /etc/os-release:查看系统内核版本(确认在 3.10 以上)
uname -r:查看服务器版本
② 查看docker当前的状态 systemctl status docker 若在运行则 systemctl stop docker
③ 查看yum安装的docker包 yum list install | grep docker
查看docker相关的rpm文件rpm -qa | grep docker
卸载依赖 yum remove docker-ce docker-ce-cli containerd.io
删除资源(其中 /var/lib/docker 是 docker 的默认工作路径)rm -rf /var/lib/docker
检查是否卸载完全yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
若全部出现No match for argument:xxx则表示清除干净
④更行yum源文件 yum -y update ;安装epel源 yum install -y epel-release;清除yum缓存 yum clean all 列出所有可安装的包yum list
⑤安装并且运行dockers yum install docker-io -y
systemctl start docker
⑥检查安装结果docker info
启动:systemctl start docker 停止:systemctl stop docker 重启:systemctl restart docker
验证是否启动成功:docker version
有显示内容,就表示已经启动成功了
```bash
1) 首先拉取 centos
docker pull centos
2)创建一个 centos
在这里添加端口映射,hadoop001 要用到的端口是: 9870 和 8020,主机端口自定义
需要读写数据的 9866 端口,这里的主机映射端口只能设置为 9866,不能自定义
docker run --privileged=true --name=hadoop001 -p xxx:9870 -p xxx:8020 -p 9866:9866 -dit centos /sbin/init
注:这里有三个-p,添加三个端口映射。
-dit 表示交互式且后台运行,少了 -it 容器会自动停止
--privileged=true 和 /sbin/init 表示特权启动,后面可能需要实用到 service 命令,需要由这个权限才可以
3)为该容器配置JDK和hadoop环境
将JDK和hadoop从主机复制到该容器中
docker cp <jdk路径> <容器id>:<容器路径> (jdk选用java version "1.8.0_212"的版本,hadoop选用Hadoop 3.1.3的版本)
docker cp <hadoop路径> <容器id>:<容器路径> (容器id即这串数字:27bc00bf4854;容器路径:在容器里面选定一个位置,建议选定路径/opt/module)
在 /etc/profile.d/ 下建议重新创建文件 my_env.sh,也可以直接在mydex.sh文件上修改,若重新创建my_env.sh,其路径与mydex.sh文件中配置路径保持一致
vim my_env.sh文件内容如下:
# Java
export JAVA_HOME=<jdk在容器的路径>
export PATH=$PATH:$JAVA_HOME/bin
# Hadoop
export HADOOP_HOME=<hadoop在容器的路径>
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
第一个是JDK的路径,第二个是hadoop的绝对路径,若路径不对,则在后面启动集群HDFS时,会出现找不到HADOOP_HOME,频繁报错
最后进入上一级目录/etc目录下执行source profile
4)安装JDK和hadoop
检查环境中是否存在老版本的JDK:输入JAVA命令或者which java(得到JDK安装的绝对路径)
删除jdk:rm -rf jdk安装的路径
安装JDK: tar -zxvf 文件名 解压路径(/opt/module/)
安装hadoop: tar -zxvf 文件名 解压路径(/opt/module/)
返回3)核对JDK和hadoop在容器中的路径,确保正确
我们配置集群需要通过ssh连接产生联系,但是ssh默认情况下需要人为来配置
1)首先需要设置密码(输入以下命令,回车设置密码即可)
passwd root
大概率会提示没有该命令,就得下载它,然后再设置就好了
yum install passwd
2) 然后下载 ssh,以下三步(安装了服务端和客户端)
yum install openssh
yum install openssh-server
yum install openssh-clients
3) 然后检查配置文件,查看以下两个配置是否一样(默认不需要更改)
vim /etc/ssh/sshd_config
// PermitRootLogin yes
// PasswordAuthentication yes
该文件中应该没有以上注释的两行,默认情况下是不需要更改的
这两个配置允许外网通过 ssh 连接该服务器(容器)
4) 如果发现不是这样,就修改它,同时需要重启 ssh 是指生效
service sshd restart
通过上面的一顿操作,此时可以在主机上访问到该容器内部
首先在容器内,使用 ifconfig 查看 IP 地址
ifconfig
没有这个命令的话,就下载他[doge]
yum install net-tools
在服务器本机中,通过 ssh 访问该 IP 地址尝试连接
ssh <IP>
然后要求输入密码,就是上面我们已经设置了的密码
进入到容器内部还可以通过docker命令实现:docker exec -it 243c32535da7(容器ID) /bin/bash
想要克隆出多个容器,就得先将其打包成镜像,然后拉取镜像,就可创建出新的容器
1) 创建镜像
docker commit -a='Maple' -m='Hadoop cluster example through docker by Maple' <容器ID> <hadoop-docker(名字):v1(版本)>
2) 由该进项克隆多个容器模拟集群(这里以三台服务器的集群为例)
hadoop002 要用到的端口是: 8088,主机端口自定义
docker run --privileged=true --name=hadoop002 -p xxx:8088 -dit hadoop-docker(名字):v1(版本) /sbin/init
hadoop003 要用到的端口是: 9868,主机端口自定义
docker run --privileged=true --name=hadoop003 -p xxx:9868 -dit hadoop-docker(名字):v1(版本) /sbin/init
在这些容器生成好后,为它们配置一个 IP 地址映射
往后就不用去记住每一个容器的 IP 地址了
但同时由于 docker 网桥模式的特性,当容器重启时,会按顺序为该容器分配一个 IP,使得该 IP 地址不是固定的会变化,这对我们已经做的映射非常不友好,所以接下来的第一步,是为每个容器固定一个 IP 地址(这里需要借助 pipework)
1)安装 pipewoek(下载并复制可执行文件到 bin 目录)
git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
2)安装 bridge-utils
yum -y install bridge-utils
注:bridge-utils可能没有这个源,此时需要我们手动下载安装
#源码下载bridge-utils-1.6,将其上传到服务器
#源码解压tar -zxvf bridge-utils-1.6.tar.xz
#安装autoconfig工具:yum install autoconfig
#使用autoconfig生成配置文件 autoconfig
#配置,生成makefile文件 ./configure
#编译与安装 make;make install
#bridge-utils安装完毕,测试安装情况 brctl show
3)创建网络(这里 IP 地址自定义)
brctl addbr br0
ip link set dev br0 up
ip addr add 172.17.0.1 dev br0
4)为各个容器设置固定的 IP
pipework br0 <容器名> IP/掩码,如:
pipework br0 hadoop001 172.17.0.2/24
pipework br0 hadoop002 172.17.0.3/24
pipework br0 hadoop003 172.17.0.4/24
5)测试这几个 IP 是否可用
ping 172.17.0.2
6)中途如果不小心操作错了(比如说我--),想删除网络或IP,可执行如下
删除网络: ip link set dev br0 down
brctl delbr
删除 IP: ip link set dev <名称> down
其中<名称>来自于 ifconfig 查找到的 veth1plxxx
这样就成功地为每一个容器固定好 IP 地址了,接下来就可以在容器内配置映射了
在每一台容器中,修改 hosts 文件
vim /etc/hosts
比如说我的,就在文件中增加:
172.17.0.2 hadoop001
172.17.0.3 hadoop002
172.17.0.4 hadoop003
配置完毕后,我们就可以直接通过名字轻松连接各个容器了,如:
ssh hadoop003
容器之间虽然能正常互相连接了,但如果每次都需要输入密码,那是及其不方便的
再而,到后面启动集群的时候,如果没有免密登录,既有可能会失败
所以我们可以为各个集群中的容器配置免密登录,实现各个容器之间的顺畅连接
首先我们来了解一下免密登录的原理(以 hadoop001 和 hadoop002 为例)
—— 分为公钥和私钥,私钥保密,公钥可以给别人
然后如果将 hadoop001 的公钥拷贝给 hadoop002
—— 通过命令拷贝,该公钥会保存在 hadoop002 中的 Authorized_keys 中
往后 hadoop001 想要连接 hadoop002,就可以直接通过公钥连接,无需密码
所以我们可以知道,免密登录的实现,就是将目标服务器的公钥拷贝到对方的服务器上,这样对方即可免密登录该目标服务器,而如果两台服务器要互相免密登录,当然就要互相拷贝到对方的公钥
1) 首先在 hadoop001 中,生成公钥和私钥(一路回车到底就行了,不需要输入内容)
ssh-keygen -t rsa
其中 id_rsa 为私钥,id_rsa.pub 为公钥
2) 将 hadoop001 的公钥拷贝到 hadoop002
ssh-copy-id hadoop002
注意:公钥也要拷贝到本地主机上,即hadoop001主机进行ssh-copy-id haddoop001
在hadoop安装目录下,即/opt/module/hadoop路径/etc/hadoop/路径下:修改core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个文件
将编写好的四个配置文件,同步到其他两台服务器上(hadoop002,hadoop003)
scp core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml root@hadoop002:/opt/module/hadoop-3.1.3/etc/hadoop
配置works文件
在当前目录下vim works 删除localhost,添加
hadoop001
hadoop002
hadoop003
注意:文末不能有空格
将该文件同步到其他两个容器
第一次启动时,需要进行初始化(往后就不用了,再初始化会清空数据)
hdfs namenode -format
若此时hdfs报错,则要检查/etc/profile.d/my_env.sh&mydex.sh文件配置的路径
若出现警告,则检查JDK的版本
启动DFS,首先在hadoop001容器中(配置过namenode)
进入~/hadoop/sbin目录下,执行./start-dfs.sh,然后执行jps
启动yarn,在hadoop002中操作(配置过ResourceManager)
进入~/hadoop/sbin目录下,执行./start-yarn.sh,在执行jps检查
在hadoop003中,执行jps检查
到此,集群启动成功
#远程连接服务器并访问端口:
首先在阿里云服务器上打开端口;要在这个面板上添加端口号,在shell环境中关闭防火墙
[root@****** ~]# netstat -ntlp |grep 9870
tcp 0 0 0.0.0.0:9870 0.0.0.0:* LISTEN 3504096/docker-prox
tcp6 0 0 :::9870 :::* LISTEN 3504102/docker-prox
具体技术可以参考这篇博客
https://blog.csdn.net/Ice__Clean/article/details/120577867