通过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的策略,应将虚拟机的防火墙打开再启动容器

浙公网安备 33010602011771号