Hadoop環境搭建--Docker完全分布式部署Hadoop環境(菜鳥采坑吐血整理)


系統: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

 

  • /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

  • 在容器的/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/

執行  vi etc/hadoop/hadoop-env.sh 

在文件末尾添加jdk目錄(這里=后面添加的是你的jdk目錄)
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節點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM