從0開始在 docker 中配置 hadoop 集群

用 ubuntu 18.x.x 作為基礎鏡像,日後我會整理出一個Dockerfile

製作 hadoop 集群的基礎鏡像

# 拉取 ubuntu 鏡像
docker pull ubuntu
# 生成一個容器
# --name 給容器命名
# -v 掛載宿主機路徑
docker run -itd --name hadoop-base -v /Users/zhangbo/Documents/docker_hadoop_data_base:/home/novadeep ubuntu
# 進入該容器
docker exec -it hadoop-base /bin/bash
# 安裝所需軟件包
apt-get update
apt-get install vim
apt install net-tools
apt-get install iputils-ping
apt-get install openssh-server
  • 在宿主機上下載 jdk 與 hadoop,然後放到容器與之對應的宿主文件夾下
  • hadoop-3.2.0.tar.gz
  • jdk-8u201-linux-x64.tar.gz
# 解壓
tar -zxvf hadoop-3.2.0.tar.gz
tar -zxvf jdk-8u201-linux-x64.tar.gz
# 進入 .bashrc 中配置 java 及 hadoop 環境變量
vim ~/.bashrc
export JAVA_HOME=/home/novadeep/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export HADOOP_HOME=/home/novadeep/hadoop-3.2.0
export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
# 退出 .bashrc 文件後,刷新環境變量
source ~/.bashrc
  • 製作 ssh 免密登錄
# 生成密鑰
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 查看本地 host
cat /etc/hosts
ssh your_local_ip
# 退出容器
exit
  • 至此 hadoop 集群容器做作完成
# 把該容器提交成鏡像
docker commit hadoop-base hadoop-base
# 查看剛提交的鏡像
...MacBook-Pro:/ zhangbo$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hadoop-base latest eb27091630dd 25 hours ago 265MB

編輯 hadoop 的配置文件

這裡需要編輯7個配置文件hadoop-env.sh | yarn-env.sh | core-site.xml | hdfs-site.xml | yarn-site.xml | mapred-site.xml | workers注意老版本中workers被叫做slaves 由於某種原因你們懂得,新版本中被改成了 workers
  • hadoop-env.sh 添加以下內容
export JAVA_HOME=/home/novadeep/jdk1.8.0_201
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"
 
  • yarn-env.sh 添加以下內容
export JAVA_HOME=/home/novadeep/jdk1.8.0_201
  • core-site.xml
 
 
 
 
 fs.default.name 
 
 
 hdfs://master:9000 
 
 
 
 
 fs.defaultFS 
 
 
 hdfs://master:9000 
 
 
 
 
 hadoop.tmp.dir 
 
 
 /home/novadeep/tmp 
 
 
 
  • hdfs-site.xml
 
 
 
 
 dfs.namenode.name.dir 
 
 
 file:/home/novadeep/hdfs/name 
 
 
 
 
 dfs.datanode.data.dir 
 
 
 file:/home/novadeep/hdfs/data 
 
 
 
 
 dfs.replication 
 
 
 2 
 
 
 
 
 dfs.webhdfs.enabled 
 
 
 true 
 
 
 
 
 dfs.permissions.superusergroup 
 
 
 staff 
 
 
 
 
 dfs.permissions.enabled 
 
 
 false 
 
 
 
  • yarn-site.xml
 
 
 
 
 yarn.resourcemanager.hostname 
 
 
 master 
 
 
 yarn resourcemanager hostname is master 
 
 
 
 
 yarn.nodemanager.aux-services 
 
 
 mapreduce_shuffle 
 
 
 just mapreduce_shuffle can run MapReduce 
 
 
 
  • mapred-site.xml
 
 
 
 
 mapreduce.framework.name 
 
 
 yarn 
 
 
 mapreduce's framework is yarm 
 
 
 
  • workers 把localhost刪掉,添加以下內容。這裡面添加的就是worker的host,下面會說到
node1
node2
node3

使用 docker 模擬 hadoop 集群

  • 1主3從的配置

iphost name172.17.0.2master172.17.0.3node1172.17.0.4node2172.17.0.5node3

  • 在 docker 中開啟容器,注意與之對應的宿主文件夾。把hadoop-3.2.0、jdk1.8.0_201先複製到node123中


從0開始在 docker 中配置 hadoop 集群


主節點與從節點文件夾

# 啟動容器
docker run -itd --name hadoop-master 
-v /Users/zhangbo/Documents/docker_hadoop_data_base:/home/novadeep 
-p 9870:9870 
-p 9864:9864 
-p 9866:9866 
-p 9867:9867 
-p 9868:9868 
-p 8485:8485 
-p 8480:8480 
-p 50200:50200 
-p 10020:10020 
-p 19888:19888 
-p 10033:10033 
-p 8032:8032 
-p 8030:8030 
-p 8088:8088 
-p 8031:8031 
-p 8033:8033 
-p 8040:8040 
-p 8048:8048 
-p 8042:8042 
-p 10200:10200 
-p 8188:8188 
-p 8047:8047 
-p 8788:8788 
-p 8046:8046 
-p 8045:8045 
-p 8049:8049 
-p 8089:8089 
-p 9871:9871 
-p 9865:9865 
-p 8481:8481 
-p 19890:19890 
-p 8044:8044 
-p 8190:8190 
-p 8091:8091 
-h master hadoop-base
docker run -itd --name hadoop-node1 
-v /Users/zhangbo/Documents/docker_hadoop_data_base/node1:/home/novadeep 
-p 9870 
-p 9864 
-p 9866 
-p 9867 
-p 9868 
-p 8485 
-p 8480 
-p 50200 
-p 10020 
-p 19888 
-p 10033 
-p 8032 
-p 8030 
-p 8088 
-p 8031 
-p 8033 
-p 8040 
-p 8048 
-p 8042 
-p 10200 
-p 8188 
-p 8047 
-p 8788 
-p 8046 
-p 8045 
-p 8049 
-p 8089 
-p 9871 
-p 9865 
-p 8481 
-p 19890 
-p 8044 
-p 8190 
-p 8091 
-h node1 hadoop-base
docker run -itd --name hadoop-node2 
-v /Users/zhangbo/Documents/docker_hadoop_data_base/node2:/home/novadeep 
-p 9870 
-p 9864 
-p 9866 
-p 9867 
-p 9868 
-p 8485 
-p 8480 
-p 50200 
-p 10020 
-p 19888 
-p 10033 
-p 8032 
-p 8030 
-p 8088 
-p 8031 
-p 8033 
-p 8040 
-p 8048 
-p 8042 
-p 10200 
-p 8188 
-p 8047 
-p 8788 
-p 8046 
-p 8045 
-p 8049 
-p 8089 
-p 9871 
-p 9865 
-p 8481 
-p 19890 
-p 8044 
-p 8190 
-p 8091 
-h node2 hadoop-base
docker run -itd --name hadoop-node3 
-v /Users/zhangbo/Documents/docker_hadoop_data_base/node3:/home/novadeep 
-p 9870 
-p 9864 
-p 9866 
-p 9867 
-p 9868 
-p 8485 
-p 8480 
-p 50200 
-p 10020 
-p 19888 
-p 10033 
-p 8032 
-p 8030 
-p 8088 
-p 8031 
-p 8033 
-p 8040 
-p 8048 
-p 8042 
-p 10200 
-p 8188 
-p 8047 
-p 8788 
-p 8046 
-p 8045 
-p 8049 
-p 8089 
-p 9871 
-p 9865 
-p 8481 
-p 19890 
-p 8044 
-p 8190 
-p 8091 
-h node3 hadoop-base
  • 啟動後查看已啟動的容器,由於默認的docker ps會有端口列,上面的容器開啟的端口太多會妨礙查看。所以我們使用 --format 選項,來重新規定展示內容
# 使用 --format 來重新規定展示內容
docker ps --format "{{.ID}} : {{.Image}} : {{.Command}} : {{.Status}} : {{.Names}} : {{.Networks}}"
8c62fa26c36b : hadoop-base : "/bin/bash" : Up 2 hours : hadoop-node3 : bridge
ebaf47e07b28 : hadoop-base : "/bin/bash" : Up 2 hours : hadoop-node2 : bridge
10c0f49daa0f : hadoop-base : "/bin/bash" : Up 2 hours : hadoop-node1 : bridge
40816b388966 : hadoop-base : "/bin/bash" : Up 2 hours : hadoop-master : bridge
# --format 選項可以定義的列描述
Placeholder Description
.ID Container ID
.Image Image ID
.Command Quoted command
.CreatedAt Time when the container was created.
.RunningFor Elapsed time since the container was started.
.Ports Exposed ports.
.Status Container status.
.Size Container disk size.
.Names Container names.
.Labels All labels assigned to the container.
.Label Value of a specific label for this container. For example '{{.Label "com.docker.swarm.cpu"}}'
.Mounts Names of the volumes mounted in this container.
.Networks Names of the networks attached to this container.
  • 至此 hadoop 集群的容器啟動完成,接下來開始做最後的配置。

完成最後的集群部署

  • 修改各個容器的hosts和開啟ssh服務
# 依次使用命令進入到容器中
docker exec -it hadoop-master /bin/bash
# 修改 master 的 hosts。加入以下節點的 host
vim /etc/hosts
172.17.0.3 node1
172.17.0.4 node2
172.17.0.5 node3
# 開啟 ssh
service ssh start
# 退出 master 容器
exit
# 進入 node1 節點的容器中
docker exec -it hadoop-node1 /bin/bash
# 修改 node1 的 hosts。加入 master 的 host
vim /etc/hosts
172.17.0.2 master
# 開啟 ssh
service ssh start
# 退出 master 容器
exit
# 其餘節點同 node1
....
....
  • 啟動 hadoop 集群
# 第一次啟動前,需要執行 namenode format 
hadoop namenode -format
# 啟動 hadoop 集群
start-all.sh
# 查看啟動節點
root@master:/# jps -l
609 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
341 org.apache.hadoop.hdfs.server.namenode.NameNode
873 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
1545 sun.tools.jps.Jps
# ssh 到 node1
ssh root@node1
# 查看啟動節點
root@node1:~# jps -l
241 org.apache.hadoop.yarn.server.nodemanager.NodeManager
117 org.apache.hadoop.hdfs.server.datanode.DataNode
447 sun.tools.jps.Jps


分享到:


相關文章: