通过Docker搭建Hadoop集群

1、准备部分

下载docker

yum -y install docker-ce

配置加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的阿里云镜像"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

拉取镜像

docker pull centos:7

使用docker创建自定义网络

#创建名为hadoop的网络,网段为172.18.0.0
docker network create --subnet=172.18.0.0/16 hadoop

2、安装ssh并打包成镜像

创建容器

#创建容器
docker run -it centos:7 /usr/sbin/init
#查看所有容器进程
docker ps -a
#进入容器
docker exec -it 957d74fbe763 /bin/bash

下载 which 组件(重要),没有这个组件,hadoop version会出问题

yum -y install which

刚拉取下来的centos是非常干净的,干净到连ssh都没有,所以需要安装ssh,配置密码

#更新yum
yum -y update
#安装ssh
yum -y install openssh-server
yum -y install openssh-clients
#设置密码
passwd
输入密码
输入密码
#退出容器
exit

配置完ssh之后需要将刚才的容器打包成镜像

#先查看刚才配置完成的容器ID
docker ps -a
#这里示例的id为 957d74fbe763  
#对此容器进行打包
#docker commit -a "作者" -m "简要说明" 容器ID  想要打包成的镜像名称:版本号
docker commit -a "Ken" -m "ssh" 957d74fbe763 centos-ssh

3、创建容器

各节点的分配服务如下

节点分配 master slave1 slave2
HDFS DataNode NameNode DataNode Datanode SecondaryNamenode
YARN NodeManager NodeManager ResourceManager NodeManager
IP 172.18.0.101 172.18.0.102 172.18.0.103

创建容器:

#创建上面拉取镜像的容器,设置名称为master,加入自定义网络,指定ip,指定映射端口,添加/etc/hosts内容,先创建master节点容器

#master节点开放50070、9000端口
docker run -itd --name master -d -h master \
--network hadoop --ip 172.18.0.2 -p 50070:50070 -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 4040:4040 -p 19888:19888 -p 18080:18080 \
--privileged=true --add-host=master:172.18.0.2 --add-host=slave1:172.18.0.3 \
--add-host=slave2:172.18.0.4 centos-ssh /usr/sbin/init

#slave1容器开放8088端口
docker run -itd --name slave1 -d -h slave1 \
--network hadoop --ip 172.18.0.3 -p 8088:8088 \
--privileged=true --add-host=master:172.18.0.2 --add-host=slave1:172.18.0.3 \
--add-host=slave2:172.18.0.4 centos-ssh /usr/sbin/init

#slave2容器开放50090端口
docker run -itd --name slave2 -d -h slave2 \
--network hadoop --ip 172.18.0.4 -p 50090:50090 \
--privileged=true --add-host=master:172.18.0.2 --add-host=slave1:172.18.0.3 \
--add-host=slave2:172.18.0.4 centos-ssh /usr/sbin/init

4、各容器都需要执行此版块的所有步骤

docker cp指令可以将宿主机的文件拷贝到容器/opt中

语法:

docker cp 本地路径 容器ID:容器路径

docker cp ./hadoop-2.6.0.tar.gz eeac7ef025b5:/opt

进入系统路径

cd /root/.ssh

重启一遍ssh服务

#有privileged权限用这个
systemctl start sshd
#没有privileged权限用这个
/usr/sbin/sshd -D &

生成公钥私钥,空按三次回车自动生成文件

[root@master .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TdRGcOduhezNvhqy6FpLnQXGOGrmPrqvZFtqbIOEQso root@master
The key's randomart image is:
+---[RSA 2048]----+
|          o+o .  |
|         .o.o+ . |
|         o.=  + .|
| .      .oo .o + |
|+ .    +S .  .+ o|
|oE .  +   . o. . |
|. . oo o o + .  .|
|   .o==.o o o . .|
|    o**+++ . ... |
+----[SHA256]-----+

使用ssh-copy-id将ssh信息传输给各节点

#每个节点都需要进行操作
ssh-copy-id master
yes
输入密码
exit

ssh-copy-id slave1
yes
输入密码
exit

ssh-copy-id slave2
yes
输入密码
exit

5、将宿主机的文件传入容器

返回宿主机,将压缩包传输到容器hadoop101

docker cp ./hadoop-2.6.0.tar.gz hadoop101:/opt
docker cp ./jdk-8u291-linux-x64.tar.gz hadoop101:/opt

进入hadoop101

#进入/opt文件夹
cd /opt
#检查宿主机文件是否传入
ll
#将文件拷贝到另外两个节点
scp ./* slave1:/opt
scp ./* slave2:/opt

在各个节点创建module目录

cd /opt
mkdir module

将两个压缩包解压到module文件夹

tar -zxvf jdk-8u291-linux-x64.tar.gz -C module

在master节点解压hadoop

tar -zxvf hadoop-2.6.0.tar.gz -C module

6、配置环境变量

jdk部分

vi /etc/profile
#在文章末尾加上环境路径
##JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_291
export PATH=$PATH:$JAVA_HOME/bin

#退出
:wq
#更新文件使之生效
source /etc/profile
#验证环境变量
java -version

hadoop部分

vi /etc/profile
#在文章末尾加上环境路径
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
#退出	
:wq
#更新文件使之生效
soutce /etc/profile
#验证环境变量
hadoop version

7、配置完全分布式

节点分配 master slave1 slave2
HDFS DataNode NameNode DataNode Datanode SecondaryNamenode
YARN NodeManager NodeManager ResourceManager NodeManager
IP 172.18.0.101 172.18.0.102 172.18.0.103

以下操作在master节点进行

cd /opt/module/hadoop-2.6.0/etc/hadoop

核心配置文件

vi core-site.xml

<!-- 指定HDFS中NameNode的地址 -->
<property>
		<name>fs.defaultFS</name>
      <value>hdfs://master:9000</value>
</property>

<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/module/hadoop-2.6.0/data/tmp</value>
</property>

HDFS配置文件

vi hadoop-env.sh

#指定JAVA_HOME环境,直接在修改在文件里面
export JAVA_HOME=/opt/module/jdk1.8.0_291

vi hdfs-site.xml

<!-- 指定节点数量 -->
<property>
		<name>dfs.replication</name>
		<value>3</value>
</property>

<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>slave2:50090</value>
</property>

YARN配置文件

vi yarn-env.sh

#在java部分添加以下内容
export JAVA_HOME=/opt/module/jdk1.8.0_291

vi yarn-site.xml

<!-- Reducer获取数据的方式 -->
<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>slave1</value>
</property>

MapReduce配置文件

vi mapred-env.sh

#添加以下内容
export JAVA_HOME=/opt/module/jdk1.8.0_291

将当前目录下的临时文件更名成可使用的文件

cp mapred-site.xml.template  mapred-site.xml 

vi mapred-site.xml

增加内容

<!-- 指定MR运行在Yarn上 -->
<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
</property>

配置节点列表

vi slaves

#删除自带的"localhost",修改成
master
slave1
slave2

8、群起集群

在master容器将hadoop文件夹分发给各个节点

scp -r hadoop-2.6.0 slave1:/opt/module/
scp -r hadoop-2.6.0 slave2:/opt/module/

在master节点的hadoop目录下格式化namenode

bin/hdfs namenode -format

在slave1节点群起集群

start-all.sh

浏览器访问:

宿主机ip:50070
宿主机ip:8088
宿主机ip:50090

注:

问题一

重新进入容器需要source /etc/profile不然环境变量不会生效

创建容器后进不去,是run的时候没有加参数-itd

更快捷的方法是在master节点配完hadoop后分发给各节点

hadoop version指令报错HADOOP_HOME/bin/hadoop line 20的话应安装which

ssh服务没启动,systemctl使用不了的情况,使用指令/usr/sbin/sshd -D &

问题二

多次格式化会出现群起时DataNode服务丢失,需要在各节点的$HADOOP_HOME中删除data文件夹跟logs文件夹

问题三

source /etc/profile后发现所有指令都不可使用,实际是/etc/profile内容异常,退出ssh后重新登录,指令就可使用,vi /etc/profile进入文件修改后生效即可修复

问题四

关闭容器后再启动报错Error response from daemon: driver failed programming external connectivity on endpoint master,是宿主机防火墙影响了docker的策略,应将虚拟机的防火墙打开再启动容器

posted @ 2024-01-17 02:24  Shachar_xc  阅读(908)  评论(0)    收藏  举报