1. 程式人生 > >docker環境下搭建hadoop叢集(ubuntu16.04 LTS系統)

docker環境下搭建hadoop叢集(ubuntu16.04 LTS系統)

  • 我的思路是這樣:

安裝ubuntu系統---->下載docker---->在docker里拉取hadoop映象---->在此映象裡建立三個容器(Master、Slave1、Slave2)---->完成完全分散式

1.   安裝ubuntu系統(無論你是安裝的單系統,還是用虛擬機器安裝了ubuntu)

       如果想安裝單系統,步驟如下:

(1)  把ubuntu映象下載到電腦桌面(版本自選)。

(2)  再把ultraiso下載到U盤,然後解壓安裝在U盤

      在“便捷啟動→寫入新的驅動器引導扇區“這個步驟中,如果出現裝置正忙,寫入引導扇區失敗

的錯誤,這時你把防毒軟體還有其他軟體都關閉,然後把U盤拔下來,再插入,問題就解決了。

   (4)  重啟電腦,根據自己的電腦情況進入BOIS介面(相信小夥伴們都用u盤重灌過電腦,這裡我就不再贅述),

假如你進入BOIS介面時沒有跟連結中的介面一樣,那麼可能是兩個問題  a、製作U盤啟動失敗,需重新制作。  b、重啟電腦時沒有把u盤作為首選啟動盤,這個問題百度可以搜到解決。

   2.  安裝docker

安裝了ubuntu16.04 LTS後,並安裝了docker 18.06.1-ce,如下圖所示

[email protected]:~$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:56 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:23:21 2018
  OS/Arch:          linux/amd64
  Experimental:     false

3.  拉取hadoop映象,你可以選擇Docker Hub庫或者阿里雲庫,我選的是阿里雲庫,它有加速器

從阿里雲庫拉取hadoop映象,當然裡面不是所有映象都管用,可以選擇下載的區域,多試幾次吧

我拉取的映象是:registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

                        和  registry.cn-hangzhou.aliyuncs.com/aofch/hadoop      選擇其一即可,我接下來用的第一個映象,因為這個映象把我們需要的工具基本下好了,比如 jdk、hadoop、spark,省了不少事呢!

因為阿里雲有加速器,你在找hadoop映象的時候,在網頁左邊會有”映象加速器“的條目,點進去會教你配置加速器。當然裡面就是一段程式碼,你退出docker,即按下Ctrl+D,然後輸入以下程式碼:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lqbkkmob.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4.  接下來就是建立容器了,並對容器進行配置及ssh的互聯

a.   敲上指令docker pull registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

[email protected]:~$ docker pull registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

b.   經過一段時間後,映象已經下載到本地計算機,可使用指令docker images檢視是否下載成功:

[email protected]:~$ docker images
REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop   latest              8b768e1604ad        4 months ago        2.11GB

c.   這時,我們要在這個hadoop映象裡建立三個容器(Master、Slave1、Slave2),敲上如下指令:(我們先把三個容器創建出來,再慢慢裡面新增配置)docker run -it --name Master -h Master registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash

[email protected]:~$ docker run -it --name Master -h Master registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
[[email protected] local]# 

d.   此時把Master空的容器創建出來了,當然裡面什麼也沒配置,這時候敲上Ctrl+P+Q,會返回到初始目錄,並且不會退出Master容器,假如你按下Ctrl+C,也會退出到初始目錄,但是,這時候也把Master容器退出了,敲上Ctrl+P+Q後會出現下面情景,程式碼如下:

[[email protected] local]# [email protected]:~$ 
[email protected]:~$

e.   修改一下程式碼的容器名,依次創建出容器Slave1和容器Slave2:

[email protected]:~$ docker run -it --name Slave1 -h Slave1 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
[[email protected] local]# [email protected]:~$ 
[email protected]:~$ docker run -it --name Slave2 -h Slave2 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash 
[[email protected] local]# [email protected]:~$ 
[email protected]:~$

f.   至此,三個空容器已經建立完成,接下來我們要使用ssh把三個容器連線起來

我的docker裡面空空如也,沒有指令apt-get,沒有指令gedit,但是裡面有yum,可以用yum下載vim來編輯檔案,還可以用yum下載openssh-clients,openssh-server,如果你在docker裡面連yum都沒有,那麼你先使用Ctrl+P+Q退出,在初始目錄用apt-get下載一個yum(指令是  sudo apt-get  install yum ),然後在docker裡面就可以使用了。

先對Master容器進行配置,進入Master容器,敲上指令    docker attach Master

[email protected]:~$ docker attach Master
[[email protected] local]# 

我們先下載vim,敲上指令  yum -y install vim

[[email protected] local]# yum -y install vim
.......過程省略
Complete!
[[email protected] local]# 

再把openssh-clients和openssh-server下載下來,注意按我說的順序下載,先下openssh-clients

[[email protected] local]# yum -y install openssh-clients
.......
Complete!
[[email protected] local]# yum -y install openssh-server
.......
Complete!
[[email protected] local]

g.  這時我們配置Master容器的ssh金鑰

先執行指令  /usr/sbin/sshd,會出現下列情景

[[email protected] local]# /usr/sbin/sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.

再執行指令    /usr/sbin/sshd-keygen -A  ,出現下列情景

[[email protected] local]# /usr/sbin/sshd-keygen -A
/usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory
Generating SSH2 RSA host key: /usr/sbin/sshd-keygen: line 63: success: command not found

Generating SSH2 ECDSA host key: /usr/sbin/sshd-keygen: line 105: success: command not found

Generating SSH2 ED25519 host key: /usr/sbin/sshd-keygen: line 126: success: command not found

再次輸入一遍   /usr/sbin/sshd   即可

[[email protected] local]# /usr/sbin/sshd
[[email protected] local]# 

上述三步必不可少,不然會出現   ssh: connect to host localhost port 22: Cannot assign requested address   等錯誤

然後我們就開始製作金鑰了,輸入指令  ssh-keygen -t rsa   ,然後都按  Enter  鍵

[[email protected] local]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
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:BPC1QSB9LcIro8HoVtPSFoHMvDjMqgmdkhCoi+M167c [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|. + +=+o+.       |
|o  = ++ooo.      |
|++. + o+o.       |
|+=o=o+..         |
|=+o++o  S        |
|Oo+o             |
|=+. o            |
|o. . .           |
|  ...E.          |
+----[SHA256]-----+
[[email protected] local]# 

生成的金鑰如圖所示存在  /root/.ssh/id_rsa.pub  檔案中了,我們需要把金鑰儲存在 /root/.ssh/authorized_keys  檔案中,指令是: cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys  

[[email protected] local]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
[[email protected] local]#

此時,你可以使用指令   cat /root/.ssh/authorized_keys   檢視authorized_keys 檔案中是否有你剛才存入的金鑰

[[email protected] local]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnfGoobPBQlX38ePTP88oTWeYZvaR73ADrDPTyEEX6Fy4Og4IQcd6pq5g0vjUdVxCVnes7Us+CpKvPkrqjAqDPm/oY61jplDZCzxEG45kbHl06SY8X/+Km12PsKjOKWDJzCwTs1u0EnXL1UDmFePGhv/MJNPti+hM+itNM/QWfk6ObzFjDY6sGexe3zRqi9fdZLZVNFL3PPIfS0cHdA/Vw+8FXeEfFifTwRNwOVG9rKEsL2TyhCcynn4hRJ9AFwl18GvJn5eLxuPeVVuKn8yzGpDhVvuntdGVxCcGgaWiwyb/W8mtxozXP1C5fKkM6fghj46kK9MdtR14f49Tkc5JB [email protected]
[[email protected] local]#

到這裡,你的Master容器的ssh已經配好了,可以使用指令  ssh localhost  驗證一下  ,敲上之後,需要再輸入 yes,雖然有warning,但是不用管它,帶回配置了  /etc/ssh/sshd_config  檔案就什麼警告也沒了,驗證完了 敲上 Ctrl+D即可斷開與localhost的ssh連線

[[email protected] local]# ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:TrBwBsvNKUoilsNryQVTpHVmBgBHLnFUuBFcQdQafJs.
ECDSA key fingerprint is MD5:cb:69:58:d4:c0:f8:60:71:4d:5b:59:bf:07:d4:da:af.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
[[email protected] ~]# logout
Connection to localhost closed.
[[email protected] local]# 

為了ssh連結時的美觀簡潔,我們配置其/etc/ssh/sshd_config  檔案,輸入指令   vim  /etc/ssh/sshd_config  進入編輯檔案模式,

[[email protected] local]# vim /etc/ssh/sshd_config

進去編輯檔案之後,敲上 i ,此時進入編輯模式,按照我下面所列的程式碼,找到它,並改成我這樣

Port 22
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
PrintLastLog no

然後按下  Esc 鍵,進入命令模式, 再敲上指令  :wq   退出這個編輯檔案介面,回到Master容器介面

再敲上指令  vim  /etc/ssh/ssh_config   ,找到StrictHostKeyChecking no  (大約在第35行) ,將以前的  # 去掉,並把  ask  改成  no

[[email protected] local]# vim /etc/ssh/ssh_config 
StrictHostKeyChecking no

改完之後同樣敲上 Esc 鍵,進入命令模式, 再敲上指令  :wq   退出這個編輯檔案介面,回到Master容器介面

這時候按下Ctrl+P+Q,返回到初始目錄,檢視此時三個容器的ip地址,輸入命令: docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) 

[[email protected] local]# read escape sequence    
[email protected]:~$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
/Master - 172.17.0.2
/Slave1 - 172.17.0.3
/Slave2 - 172.17.0.4
[email protected]:~$

然後進入Master容器(指令是docker attach Master),開啟 /etc/hosts 檔案,把上述內容填上,目的是給每個節點的 ip 附上名字,ssh連線的時候就可以直接  ssh Slave1,而不是 ssh 172.17.0.3 這麼麻煩了,所以,我們再次敲上指令 docker attach Master  進入Master 容器 ,編輯 /etc/hosts 檔案,所以敲上指令 vim /etc/hosts   ,進入編輯模式,將容器名及其對應的 ip 填入 ,修改完之後回到Master 容器,如果還有不會使用vim修改檔案的小夥伴請看這個連結:https://blog.csdn.net/yu870646595/article/details/52045150

[email protected]:~$ docker attach Master
[[email protected] local]# vim /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      Master
172.17.0.3      Slave1
172.17.0.4      Slave2

至此,Master 容器已經配置完成,然後我們敲上 Ctrl+P+Q  退出當前的Master容器,然後敲上 docker  attach Slave1 ,進入Slave1容器,用和Master容器相同的方法,把Slave1也配置一遍(就是從下載vim開始到配置/etc/hosts檔案這幾個步驟),再用相同的方式 把 Slave2 也配置完。

h.   三個容器Master、Slave1、Slave2 的配置終於接近尾聲,僅差最後一步,我們需要把三個容器的每個金鑰都要放在自己容器的/root/.ssh/authorized_keys檔案中,只有這樣才能把三個容器的互信建立起來假如你不這樣做,你在Master容器中用ssh連線其他容器(比如連線Slave1),那麼它會提示你輸入Slave1的密碼,而這個密碼你輸入什麼也不對

因為每個容器的  /root/.ssh/authorized_keys檔案都需要填入 所有容器的金鑰,而此時我們剛配置完Slave2容器,那麼直接輸入 vim  /root/.ssh/authorized_keys,進去檔案,然後按 i 進入編輯模式,把Slave2的金鑰拷貝到一個檔案中(你在電腦桌面新建一個臨時檔案即可),儲存結束,退出檔案,然後Ctrl+P+Q退出Slave2容器,然後 敲上 docker attach Slave1 ,進入Slave1 容器,相同的方式把Slave1的金鑰也拷貝出來,然後退出Slave1,進入Master容器,把剛才拷貝的兩個金鑰追加到/root/.ssh/authorized_keys檔案中(就是進入這個檔案切換為編輯模式,把那兩個金鑰複製過來就行),然後把這個三個金鑰拷貝出來,複製到Slave1的  /root/.ssh/authorized_keys檔案中,也同樣複製到Slave1的  root/.ssh/authorized_keys檔案中。用到的詳細指令如下:

(1)   vim /root/.ssh/authorized_keys 進去之後  按下i,複製金鑰到一個臨時新建的檔案(你在桌面臨時建一個就行)

(2)   按下  Esc  , 敲上   :wq    儲存並退出檔案, 敲上  Ctrl+P+Q  退回初始目錄 ,

(3)   docker  attach  Slave1  進入Slave1容器

(4)  重複第(1)(2)步

(5)   docker  attach  Master   進入Master容器

(6)   vim /root/.ssh/authorized_keys 進去之後  按下i ,把剛才複製的兩個金鑰放到到這個檔案中,並把這個三個金鑰臨時存到一  個檔案中

(7)   按下  Esc  , 敲上   :wq    儲存並退出檔案, 敲上  /usr/sbin/sshd   再敲上  Ctrl+P+Q  退回初始目錄 ,

(8)   docker  attach  Slave1  進入Slave1容器

(9)  vim /root/.ssh/authorized_keys進去之後  按下i,刪除所有,把剛才複製的三個金鑰放到到這個檔案中

(10)按下  Esc  , 敲上   :wq    儲存並退出檔案,敲上  /usr/sbin/sshd   再敲上  Ctrl+P+Q  退回初始目錄

(11)docker  attach  Slave2  進入Slave2容器

(12)   vim /root/.ssh/authorized_keys進去之後  按下i,刪除所有,把剛才複製的三個金鑰放到到這個檔案中

(13) 按下  Esc  , 敲上   :wq    儲存並退出檔案, 敲上  Ctrl+P+Q  退回初始目錄 , docker  attach  Master 進入 Master容器

敲上  /usr/sbin/sshd

在所有金鑰都放入各個容器之後,我們進行驗證一下,在Master容器中,我們輸入指令 ssh Slave1 ,看到的情景有下面幾個情況:

   如果你出現下面錯誤,那麼你肯定沒在每個容器中的 /etc/hosts  檔案中輸入所有的容器的名字及其對應的 ip 地址

[[email protected] local]# ssh Slave1
ssh: Could not resolve hostname slave1: Name or service not known
[[email protected] local]# ssh Slave2
ssh: Could not resolve hostname slave2: Name or service not known

②   假如你出現下面錯誤,那麼你肯定沒在退出每個容器前 敲上指令 /usr/sbin/sshd  ,看上述13個步驟的紅字,很重要!

[[email protected] local]# ssh Slave1
ssh: connect to host slave1 port 22: Connection refused
[[email protected] local]#
[[email protected] local]# ssh Slave2
ssh: connect to host slave1 port 22: Connection refused
[[email protected] local]#

現在我們終於可以成功的驗證了,現在 Master 容器中連線  Slave1 ,指令是ssh Slave1      如下圖:

[[email protected] local]# ssh Slave1
[[email protected] ~]# 

由圖可知,成功了,敲上 Ctrl +D 斷開與 Slave1 的連線 ,再驗證與 Slave2  的連線,指令是 ssh  Slave2  ,成功後,Ctrl+D斷開與 Slave2 的連線。

[[email protected] local]# ssh Slave1
[[email protected] ~]# logout
Connection to slave1 closed.
[[email protected] local]# ssh Slave2
[[email protected] ~]# 
[[email protected] ~]# logout
Connection to slave1 closed.
[[email protected] local]#

③   假如你連線Slave1時,還提示了很多資訊,不像我這樣簡潔,比如還有 LastLogin 之類的提示資訊,那你肯定是每個容器vim  /etc/ssh/sshd_configvim  /etc/ssh/ssh_config檔案的配置沒有跟我的一樣,在上述步驟 g 中,會有這兩個檔案的配置。

I.    ssh互聯成功之後,我們便開始使用hadoop進行實戰,但在這之前還需配置每個容器的環境變數

  首先我們檢視JAVA_HOME的地址,在 hadoop-env.sh 檔案中,我們並不知道這個檔案的具體路徑,沒關係,我們只需知道它的名字,使用指令  find / -name hadoop-env.sh   搜尋它即可,(注意這時候我們目前是在Master容器介面裡)

[[email protected] local]# find / -name hadoop-env.sh
/usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
[[email protected] local]# 

我們 用指令 vim /usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh  進入這個檔案,看到JAVA_HOME這一行,記錄它的路徑然後退出這個檔案即可:

[[email protected] local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_162

在這個映象中,JAVA_HOME路徑給我們設定好了,我們需要記住這個地址,待會會在其他配置中用到。

接下來我們依次配置每個容器core-site.xmlyarn-site.xmlmapred-site.xml hdfs-site.xml 檔案

   首先使用 find / -name core-site.xml 的具體路徑,然後用指令  vim + 檔案路徑  進入這個檔案

[[email protected] local]# find / -name core-site.xml
/usr/local/hadoop-2.7.5/etc/hadoop/core-site.xml
[[email protected] local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/core-site.xml

裡面的配置改成如下圖所示:然後 :wq 儲存退出

<!-- Put site-specific property overrides in this file. -->
<configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://Master:9000</value>
      </property>
      <property>
         <name>io.file.buffer.size</name>
         <value>131072</value>
     </property>
     <property>
          <name>hadoop.tmp.dir</name>
          <value>/usr/local/hadoop-2.7.5/tmp</value>
     </property>
</configuration>

  進入yarn-site.xml 進行配置,結束後儲存退出。

[[email protected] local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/yarn-site.xml
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
     <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
     </property>
     <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.mapreduce.shuffle.class</name>
         <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
</configuration>

   進入mapred-site.xml  進行配置,結束後儲存退出

[[email protected] local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/mapred-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
 <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

   進入hdfs-site.xml  進行配置,結束後儲存退出

[[email protected] local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/usr/local/hadoop-2.7.5/hdfs/name</value>
    </property>
</configuration>

J.   在步驟I 中是配置 Master 容器的環境變數,我們還需要進入Slave1容器,相同的程式碼把 Slave1的環境變數也配置完,當然容器slave2也是如此。唯一不同的是在步驟⑤ 的hdfs-site.xml中,Master容器設定的是namenode,而Slave1和Slave2設定的是datanode,如下圖

[[email protected] local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/usr/local/hadoop-2.7.5/hdfs/data</value>
    </property>
</configuration>

K.   現在我們在Master容器中通過ssh連線Slave1(或Slave2),刪除其hdfs所有目錄 (這個目錄就在剛才的hdfs-site.xml檔案中,忘了的話你再vim開啟它,把datanode儲存的路徑記下來,我的是 /usr/local/hadoop-2.7.5/hdfs/data) ,並重新建立,程式碼如下。因為下一步的格式化只能用一次,用兩次的話就需要用到這一步,為了保險,我們在第一次就直接用這一步,以免不必要的麻煩。

[[email protected] local]# ssh Slave1
[[email protected] ~]# rm -rf /usr/local/hadoop-2.7.5/hdfs
[[email protected] ~]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/data

② 在Slave1刪除並建立之後,我們 Ctrl+D 斷開與Slave1的ssh連線,然後 使用指令 ssh Slave2 與Slave2容器進行連線,與Slave1相同,我們需要把hdfs目錄刪除,並重新建立,結束之後我們 Ctrl+D 斷開與Slave2的連線,回到Master容器介面,程式碼如下:

[[email protected] ~]# logout                                          
Connection to slave1 closed.
[[email protected] local]# ssh Slave2
[[email protected] ~]# 
[[email protected] ~]# rm -rf /usr/local/hadoop-2.7.5/hdfs
[[email protected] ~]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/data
[[email protected] ~]# logout                                          
Connection to slave1 closed.
[[email protected] local]#

③ Slave1和Slave2都已經刪除並重建 hdfs 目錄了,現在我們把Master容器也這麼做,注意Master容器建立的是 name子檔案,不再是 data 子檔案裡

[[email protected] local]# rm -rf /usr/local/hadoop-2.7.5/hdfs
[[email protected] local]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/name
[[email protected] local]#

L.   現在我們格式化 NameNode HDFS 目錄, 在Master容器中,使用指令 hdfs namenode -format

[[email protected] local]# hdfs namenode -format
..........一堆程式碼,此處省略
[[email protected] local]#

M.   ①我們需要進入sbin 檔案,來啟動hadoop 叢集,我們不清楚 sbin 檔案的具體路徑,所以我們可以使用 指令 find / -name sbin  找到路徑,然後 cd +路徑   進入這個路徑。

[[email protected] local]# find / -name sbin
/usr/local/sbin
/usr/local/hadoop-2.7.5/sbin
/usr/local/spark-2.3.0-bin-hadoop2.7/sbin
/usr/lib/debug/usr/sbin
/usr/lib/debug/sbin
/usr/sbin
/sbin
[[email protected] local]# cd /usr/local/hadoop-2.7.5/sbin
[[email protected] sbin]# 

②  然後我們使用指令 ./start-all.sh  來啟動叢集

[[email protected] sbin]# ./start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [Master]
Master: starting namenode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-namenode-Master.out
Slave1: starting datanode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-datanode-Slave1.out
Slave2: starting datanode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-datanode-Slave2.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-secondarynamenode-Master.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn--resourcemanager-Master.out
Slave1: starting nodemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn-root-nodemanager-Slave1.out
Slave2: starting nodemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn-root-nodemanager-Slave2.out
[[email protected] sbin]#

③  使用 jps 檢視 namenode 是否啟動,此時看的是Master容器的namenode是否啟動。

[[email protected] sbin]# jps
192 NameNode
562 ResourceManager
824 Jps
392 SecondaryNameNode
[[email protected] sbin]#

④  這裡我們可以使用  ssh Slave1  (或ssh Slave2)進入Slave1容器,然後使用指令  jps  檢視datanode是否啟動,此時會出現

-bash: jps: command not found 錯誤,如圖:

[[email protected] sbin]# ssh Slave1
[[email protected] ~]# jps
-bash: jps: command not found

這時我們需要配置 /etc/profile檔案,每個容器(包括Master、Slave1、Slave2)都需要配置這個檔案,使用指令  vim /etc/profile,末尾新增程式碼 :

export JAVA_HOME=/usr/local/jdk1.8.0_162
export HADOOP_HOME=/usr/local/hadoop-2.7.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

儲存退出後,執行生效剛才的 /etc/profile 檔案,即使用指令 source /etc/profile    ,如圖所示:

[[email protected] local]# vim /etc/profile
....進入之後末尾新增下列程式碼(根據自己的實際配置填寫,比如java版本可能每個人都不一樣)
export JAVA_HOME=/usr/local/jdk1.8.0_162
export HADOOP_HOME=/usr/local/hadoop-2.7.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
.....儲存退出後

[[email protected] local]# source /etc/profile

每個容器都配置結束後,我們再通過ssh進入其他容器,便可以使用  jps hadoop fs xx 指令了。

⑤ 我們可以使用指令 hadoop dfsadmin -report   檢視其他容器有沒有啟動

[[email protected] sbin]# hadoop dfsadmin -report
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

Configured Capacity: 982232104960 (914.77 GB)
Present Capacity: 901762801664 (839.83 GB)
DFS Remaining: 901762752512 (839.83 GB)
DFS Used: 49152 (48 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (2):

Name: 172.17.0.3:50010 (Slave1)
Hostname: Slave1
Decommission Status : Normal
Configured Capacity: 491116052480 (457.39 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 15263760384 (14.22 GB)
DFS Remaining: 450881376256 (419.92 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.81%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Tue Sep 18 03:58:01 UTC 2018

Name: 172.17.0.4:50010 (Slave2)
Hostname: Slave2
Decommission Status : Normal
Configured Capacity: 491116052480 (457.39 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 15263760384 (14.22 GB)
DFS Remaining: 450881376256 (419.92 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.81%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Tue Sep 18 03:58:01 UTC 2018


[[email protected] sbin]#

到此,我們的docker環境下的hadoop叢集已經搭建成功!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

最後,我想奉上在搭建過程中用到的命令

0. 重啟docker服務
sudo service docker restart
1.檢視所有容器的ip
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq
2. 拉取一個映象
docker pull <映象名稱>
3. 檢視所有映象
docker images
5. 檢視正在執行的容器
docker ps
6. 檢視所有容器(包括正在執行和不在執行的容器)
docker ps -a
7. 在映象裡建立一個容器並以前臺互動模式啟動它
docker run -it --name <容器名> -h <容器名> <映象名字> /bin/bash
8. 退出容器,但不關閉它(關閉之後還得啟動,並且設定的/etc/hosts內容都沒有了)
Ctrl+P+Q
9. 再次進入容器 
docker attach <容器名>
10. 在容器內下載外掛(使用yum)
yum -y install <外掛名>
11. 在容器內刪除外掛(使用yum)
yum remove <外掛名>
12. 查詢檔案的路徑
find / -name <檔名>
13. 進入檔案
cd <檔案路徑>
14. 容器內編輯檔案(使用vim)
vim <檔案路徑>    -----開啟檔案
i                 -----切換到編輯模式
Esc               -----切換到命令模式
$                 -----移到本行的最後
/關鍵字           -----查詢字元
dd                -----刪除游標所在行
:q                -----不儲存退出
:wq               -----儲存退出