系統:Centos 7,內核版本3.10
本文介紹如何從0利用Docker搭建Hadoop環境,制作的鏡像文件已經分享,也可以直接使用制作好的鏡像文件。
一、宿主機准備工作
0、宿主機(Centos7)安裝Java(非必須,這里是為了方便搭建用於調試的偽分布式環境)
1、宿主機安裝Docker並啟動Docker服務
- 安裝:
yum install -y docker
- 啟動:
service docker start
二、制作Hadoop鏡像
(本文制作的鏡像文件已經上傳,如果直接使用制作好的鏡像,可以忽略本步,直接跳轉至步驟三)
1、從官方下載Centos鏡像
docker pull centos
下載后查看鏡像 docker images 可以看到剛剛拉取的Centos鏡像
2、為鏡像安裝Hadoop
1)啟動centos容器
docker run -it centos
2)容器內安裝java
- https://www.oracle.com/technetwork/java/javase/downloads/index.html下載java,根據需要選擇合適版本,如果下載歷史版本拉到頁面底端,這里我安裝了java8
- /usr下創建java文件夾,並將java安裝包在java文件下解壓
tar -zxvf jdk-8u192-linux-x64.tar.gz
- 解壓后文件夾改名(非必需)
mv jdk1.8.0_192 jdk1.8
- 配置java環境變量 vi ~/.bashrc ,添加內容,保存后退出
export JAVA_HOME=/usr/java/jdk1.8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib export PATH=$PATH:${JAVA_HOME}/bin
使環境變量生效 source ~/.bashrc
驗證安裝結果 java -version
這里注意,因為是在容器中安裝,修改的是~/.bashrc而非我們使用更多的/etc/profile,否則再次啟動容器的時候會環境變量會失效。
3)容器內安裝hadoop
- 選擇需要的Hadoop版本,下載https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/
- 在容器的/usr/local目錄下解壓,並修改文件夾名為hadoop
tar -zxvf hadoop-2.7.6.tar.gz mv hadoop-2.7.6.tar.gz hadoop
- 設置Hadoop的java-home
進入hadoop安裝目錄(以下操作均為hadoop的安裝目錄的相對路徑)
cd /usr/local/hadoop/
export JAVA_HOME=/usr/java/jdk1.8


- 檢查安裝的hadoop是否可用 ./bin/hadoop version (注意要在hadoop的安裝目錄下執行)

- 配置hadoop環境變量
前面在驗證hadoop命令的時候需要在hadoop的安裝目錄下執行./bin/hadoop,為了方便在任意地方執行hadoop命令,配置hadoop的全局環境變量,與java一樣,修改~/.bashrc文件
執行 vi ~/.bashrc
添加內容
export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
(P.S. “HADOOP_HOME=”后面配置hadoop安裝目錄;
這里的PATH變量是java和hadoop結合的;
這樣配置之后,可以在任意位置執行hadoop命令)
source ~/.bashrc 使環境變量生效
hadoop version 驗證變量生效
4)為容器安裝輔助程序
下面安裝的程序都是在制作鏡像過程中需要用的工具或踩到的坑,提前裝好避免一些奇怪問題
- 配置時間同步服務器
安裝ntpdate yum install -y ntpdate
配置時間同步服務器
ntpdate ntp1.aliyun.com
ntp1.aliyun.com為時間同步服務器地址,百度可以查到可用服務器
- 安裝ssh
檢查是否已經默認安裝SSHClient和SSH Server
rpm -qa | grep ssh
出現如下結果表示已經安裝

yum install openssh-clients yum install openssh-server
測試ssh是否可用
ssh localhost
測試之后就是通過ssh登陸了本機,輸入 exit 退回到普通終端登陸。
- 安裝rsync
yum -y install rsync
- 安裝dbus
yum -y install dbus
5)將容器制作成鏡像
宿主機打開新終端,注意打包鏡像操作都是在宿主機內做的,(即你安裝Docker的那台機器)。
- 查看容器id
在宿主機內查看剛剛使用的容器ID
docker ps
- 打包
docker commit -m "centos7 with hadoop" c0905da23733 centos7/hadoop
命令說明:
docker commit [OPTIONS] 容器ID [鏡像[:版本標簽]]
-m 提交說明
centos7/hadoop 鏡像名稱,如果不叫版本標簽,默認為latest
- 查看打包結果 docker images
- 提交鏡像
完成上述后已經交將容器打包為本地鏡像,下面將本地鏡像提交到遠程倉庫,這里上傳到阿里雲的鏡像倉庫,需要事先注冊阿里雲賬號。
阿里雲創建倉庫https://cr.console.aliyun.com/
倉庫創建成功后打開倉庫可以看到操作指南,在宿主機終端按照指南進行后續操作
終端登陸
docker login --username=魔女小豚 registry.cn-beijing.aliyuncs.com
推送
$ sudo docker login --username=魔女小豚 registry.cn-beijing.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop:[鏡像版本號] $ sudo docker push registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop:[鏡像版本號]
根據實際鏡像信息替換示例中的[ImageId]和[鏡像版本號]參數。
三、Hadoop集群配置
1、從registry中拉取鏡像
$ sudo docker pull registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop
2、啟動鏡像
按照下述方式,根據需要的節點數啟動相應數量的容器(注意為每個容器指定不同的容器名和主機名),這里啟動3個容器作為示例
$ docker run -d --name hadoop0 -h hadoop0 -p 50070:50070 --privileged=true registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop /usr/sbin/init
其中,-d指定容器啟動的終端在后台執行(在需要使用的容器終端的時候再顯示進入容器,如3-3所述),--name hadoop0 指定容器名稱,-h hadoop0 指定容器的主機名(這里千萬注意,主機名不要包含下划線,對,就是它"_",不要包含下划線、不要包含下划線!!!否則不能啟動集群。當初因為這問題采坑好久,都是淚),--privileged=true 指定容器獲得全部權限, registry.cn-……指定鏡像, /usr/sbin/init指定運行終端
需要開放的端口:namenode開放50070,9000,sourcemanager開放8088
檢查容器是否啟動 $ docker ps
3、進入容器,查看容器ip
$ docker exec -it hadoop0 /bin/bash
其中,-it表明顯式打開容器終端,
查看全部容器ip
$ ip addr
建議使用3-2啟動鏡像以及3-3進入容器的方式運行,在開始搭建的時候各種采坑,才找到這種合適的方式,在容器使用過程中不會出現系統服務無法啟動的情況。
4、配置主機映射
$ vi /etc/hosts
將每個容器的Ip地址和主機名添加到hosts文件中
注意集群中每個節點都需要配置上述主機映射。
5、為各個集群節點配置彼此間的ssh免密登陸
- 生成本機公鑰私鑰
cd ~/.ssh/ #若沒有~/.ssh/目錄,先執行一次ssh localhost
ssh-keygen -t rsa # 會有提示,都按回車就可以,產生公鑰私鑰
在~/.ssh目錄下生成密鑰文件,id_dsa: 為私鑰;id_dsa.pub: 為公鑰
- 彼此發送密鑰
ssh-copy-id ha_slave1
注意要在每個集群節點上生成密鑰、並為其他全部集群節點發送密鑰,即在master上執行一次生成密鑰,然后執行兩次發送密鑰,分別發送給slave1 、slave2;然后再在slave1上生成密鑰發送密鑰給其他節點,再在slave2上再次執行。
5.1 關閉防火牆
service iptables stop
完成上述准備工作后對hadoop集群進行配置,在配置之前,考慮集群中節點規划,即,哪些節點作為HDFS的namenode、datanode、secnamenode,哪些節點作為yarn的sourcemanager、nodemanager。本文示例集群規划如下:
hdfs | yarn | |
master | namenoder + datanode | nodemanager |
slave1 | datanode | sourcemanager + nodemanger |
slave2 | secnamenode + datanode | nodemanger |
6、選擇一個節點,進入節點,進行HDFS配置(注意進入到hadoop安裝目錄,在我的鏡像里是 /usr/local/hadoop )
- 配置core-site.xml文件,指定HDFS主節點
vi etc/hadoop/core-site.xml
添加配置內容
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://had0:9000</value> </property>
<property> <name>hadoop.tmp.dir</name> <value>/home/data/hadoopdata</value> </property> </configuration>
指定hdfs主節點,並指定臨時文件目錄,存儲hadoop運行過程中產生的文件的目錄(注意一定配置在有權限的目錄下)
- 配置hdfs-site.xml
vi etc/hadoop/hdfs-site.xml
添加內容
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/data/hadoopdata/name</value>
</property>
<!--配置存儲namenode數據的目錄-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/data/hadoopdata/data</value>
</property>
<!--配置存儲datanode數據的目錄-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--配置部分數量-->
<property>
<name>dfs.secondary.http.address</name>
<value>had2:50090</value>
</property>
<!--配置第二名稱節點 -->
</configuration>
7、YARN配置(依然在上述選擇的節點進行配置)
- 配置yarn-site.xml
vi etc/hadoop/yarn-site.xml
添加內容
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave1</value>
</property>
<!--配置yarn主節點-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--配置執行的計算框架-->
</configuration>
- 配置mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml vi etc/hadoop/mapred-site.xml
添加內容
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
<!--配置mapreduce任務所在的資源調度平台--> </configuration>
- 配置slaves
vi etc/hadoop/slaves
添加內容
master
slave1
slave2
8、將HDFS和YARN配置發送到全部節點
需要給集群中全部節點進行3-5、3-6的配置操作,在一個節點上配置完成后,通過遠程發送配置文件,對其他節點進行配置。上述配置文件都在"hadoop安裝目錄/etc”下,方便起見,通過將etc文件夾發送到其他節點容器來完成配置。注意,此操作也要在hadoop安裝目錄下執行;通過此操作要把配置文件發送到所有集群節點上。
scp -r etc ha_slave1:/usr/local/hadoop/
四、啟動HDFS
- 初始化NameNode的元數據目錄,格式化文件系統
此操作在namenode節點上初始化一個全新的namenode的元數據存儲目錄(為hdfs-site.xml中配置的namenode數據的目錄),生成記錄元數據的文件fsimage,生成集群的相關標識,必須在HDFS的NameNode節點執行操作。
hadoop namenode -format
上圖表示格式化成功
- 啟動HDFS,可以在任意節點啟動
start-dfs.sh
- 驗證啟動結果(可以在每個節點上都進行驗證)
jps
可以看到當前節點上已經啟動了DataNode和NameNode(節點上啟動哪些進程取決於集群規划)
補充:關於HDFS的格式化,如果格式化成功,則只能格式化一次,如果HDFS啟動后需要重新格式化,格式化的步驟:
1)刪除namenode數據目錄、datanode數據目錄(在配置文件中指定的路徑)
2)重新格式化
datanode 的想過數據信息在啟動hdfs的時候生成,兩個文件(version)中的cluster ID相同時候才認為節點屬於同一集群,datanode才能受namenode管理,如果沒有刪除目錄就去進行格式化,會造成節點不屬於同一集群的問題。
五、啟動YARN
- 必須在SourceManager上啟動
start-yarn.sh
- 驗證結果
jps
由於前面啟動了HDFS,所以此時節點上可以看到hdfs和yarn的進程。
至此,使用Docker進行hadoop完全分布式搭建的工作完成。
datanode可以在線擴容,只需要把一個datanode的namenode配置成當前使用的namenode,然后啟動。如果想刪除datanode,則需要重新格式化namenode節點。