1. 程式人生 > >【轉】使用Docker搭建hadoop叢集

【轉】使用Docker搭建hadoop叢集

剛開始搭建Hadoop叢集的時候,使用的是VMware建立的虛擬機器。結果卡到心態爆炸。。。
今天嘗試使用Docker搭建hadoop叢集,發現是如此的好用快捷,也比使用VMware簡單。
在這裡記錄一下防止以後忘記,為以後的學習做準備。

1.獲取映象。

如果是本地使用VMware搭建的話,需要準備Java環境,hadoop安裝包,還要配置環境變數。雖然不難,但是經常做這些工作也難免煩躁。
使用Docker容器的話,那這一切就變得簡單多了。

首先要準備一個映象,可以使用Dockerfile構建一個合適自己的映象,或者可以在共有倉庫中找一個具有hadoop環境的映象來使用也可以。由於我是配置的阿里雲的加速器,所以在阿里雲的倉庫中找了一個具有hadoop環境的映象。

hadoop映象地址

使用命令拉到本地:

docker pull registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop

下載完成之後,通過docker images 可以檢視到該映象:

這裡寫圖片描述

2.建立容器。

有了映象之後,我們根據該映象建立三個容器,分別是一個Master用來作為hadoop叢集的namenode,剩下兩個Slave用來作為datanode。

可以使用命令:

docker run -i -t --name Master -h Master registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

命令中的-h為該容器設定了主機名,這裡設定為Master,否則建立容器之後是一串隨機的數字和字母不好辨認使用。–name指定了容器的名字,也是為了方便區分使用。

建立好Master節點的容器之後,再分別使用兩次該命令,建立兩個Slave節點。稍微改變其中的引數即可:

例如建立Slave1節點:

docker run -i -t --name Slave1 -h Slave1 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

這樣叢集的基本環境就準備好了。

3.配置SSH。

如果是本地搭建的話,需要配置的大概分為三步:
1.配置java環境。
2.配置無祕SSH。
3.配置hadoop環境。

但是下載的映象已經包含了這些內容,我們只需要簡單的配置一下就可以使用了。
在這個映象中,有關java和hadoop的內容都存放在了/opt/tools目錄下。

先檢視下環境變數都包含了什麼:

這裡寫圖片描述

從中間可以看出包含了jdk和hadoop的bin目錄,所以我們可以直接使用這兩個命令。

這裡寫圖片描述

java環境已經不需要我們來配置了。

接下來配置一下無祕的SSH。

首先將SSH執行起來。

/etc/init.d/ssh start

然後生成祕鑰,儲存到authorized_keys中。這個地方可以看一下這篇部落格:ssh-keygen 的 詳解

ssh-keygen -t rsa

執行的總體過程如下:

這裡寫圖片描述

接下來在兩個Slave節點中做相同的事情,並且將每個節點生成的祕鑰互相儲存在authorized_keys中。

也就是說,三個節點的都是這個樣子的:

這裡寫圖片描述

接下來檢視一下各自節點的ip地址,但是如果直接使用熟悉的ifconfig時,就會發現沒有這個命令。那是因為映象本身就比較簡潔,簡潔到連這個命令都沒有。。。這個我也是服。
可以使用ip addr檢視,或者:apt-get install ifconfig net-tools,安裝相關命令。

相比之下還是ip addr方便點:

這裡寫圖片描述

然後修改/etc/hosts,將主機名和對應的ip地址新增進去,這樣做為了方便呼叫ssh:

這裡寫圖片描述

如果在Master節點,想要連線到Slave1節點,可以使用:ssh 192.168.0.3,也可以使用ssh Slave1。很明顯能感覺到使用主機名比較方便理解使用。

如果使用ssh Slave1之後沒有提示需要輸入密碼,就代表成功了(第一次的話會讓輸入yes或者no,是為了記住該地址,如果輸入yes之後就可以直接連線就像下面這樣):

這裡寫圖片描述

4.配置hadoop。

到現在為止,我們已經準備好了haoop搭建的所有基本工作。也是由於該Docker映象為我們準備好了需要才會這麼簡單的。

我們只需要在配置一下hadoop相關的內容。

為了方便起見,我們可以直接在Master節點進行配置,然後使用scp命令傳送到各節點覆蓋原來的即可。

這裡不廢話,直接上程式碼,至於其中的意思可以參考書籍資料,或者檢視這個文件:hadoop安裝指南,這個文件是在VMware上配置的。

hadoop-env.sh:修改有關java的環境

export JAVA_HOME=/opt/tools/jdk1.8.0_77

core-site.xml

<configuration>

  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://Master:9000</value>
  </property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/hadoop/tmp</value>
</property>
</configuration>

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/hadoop/data</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/hadoop/name</value>
  </property>
</configuration>

mapred-site.xml

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

yarn-site.xml

<configuration>
 <property>
<name>yarn.resourcemanager.address</name>
 <value>Master:8032</value>
</property>
<property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>Master:8030</value> </property> <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>Master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>Master:8033</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>Master:8088</value>
</property>
 <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
 <property>
 <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
 <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

相關目錄會在格式化的時候會自動建立,hdfs-site.xml中的有關目錄都是以core-site.xml中的hadoop.tmp.dir為主進行配置的,所以可以先建立hadoop.tmp.dir的目錄。

然後將這些檔案通過scp傳送到各個Slave節點上覆蓋原來的檔案:

scp core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml yarn-site.xml Slave1:/opt/tools/hadoop/etc/hadoop/

到這裡為止,所有的準備工作都做好了。

5.執行hadoop。

進行格式化操作:

hadoop namenode -format

啟動叢集:

使用./start-all.sh,如果啟動過程中提示關於0.0.0.0地址輸入yes或no,輸入yes即可:

這裡寫圖片描述

在Master上使用jps檢視相關程序是否啟動:

這裡寫圖片描述

在Slave節點上使用jps檢視相關程序是否啟動:

這裡寫圖片描述

使用命令檢視各節點資訊:hadoop dfsadmin -report

這裡寫圖片描述

然後再執行一個統計單詞的例子:

現在hsfs上建立一個資料夾:

hadoop fs -mkdir /input

檢視該資料夾:

hadoop fs -ls /

這裡寫圖片描述

上傳檔案到hdfs,這裡直接將當前目錄的README.txt進行上傳:

hadoop fs -put README.txt /input/

這裡寫圖片描述

之後執行相關例子:

在/opt/tools/hadoop/share/hadoop/mapreduce目錄中執行:hadoop jar hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output

這裡寫圖片描述

注意下這裡我之前已經做過測試了,所有outout目錄已經存在了,所以換成了output1,這個目錄不需要提前建立,執行的時候指定一下,會自動建立的。

檢視相關結果輸出:

這裡寫圖片描述

可以使用: hadoop fs -cat /output1/part-r-00000 檢視一下統計結果:

這裡寫圖片描述

6.檢測叢集狀況。

可以通過Master節點的50070埠來進行檢測叢集節點執行狀態。

但是由於是伺服器,而且是Centos系統沒有圖形化介面,可以採用埠對映的方法,直接在任何地方來進行檢視。

這裡寫圖片描述

通過圖中的步驟就可以對執行中的Docker容器進行埠對映,這樣子我們就可以通過本地的瀏覽器訪問伺服器地址的50070埠,就可以直接檢視執行在Docker容器的叢集狀況。