大數據學習(2-2)- 使用docker安裝配置Hadoop環境

  • 我的思路是這樣:

安裝ubuntu系統---->下載docker---->在docker里拉取hadoop鏡像---->在此鏡像里創建三個容器(Master、Slave1、Slave2)---->完成完全分布式

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

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

(1)? 把ubuntu鏡像下載到電腦桌面(版本自選)。

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

?? (3)? 制作U盤啟動工具,參考鏈接為:https://blog.csdn.net/yaoyut/article/details/78003061

????? 在“便捷啟動→寫入新的驅動器引導扇區“這個步驟中,如果出現設備正忙,寫入引導扇區失敗的錯誤,這時你把殺毒軟件還有其他軟件都關閉,然后把U盤拔下來,再插入,問題就解決了。

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

這時候參考 :https://blog.csdn.net/ramse/article/details/52716937?

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

?? 2.? 安裝docker

參考鏈接為:https://blog.csdn.net/diligent_lee/article/details/79098302

?英語好的可以看這個:https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository

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

  1. zhangqingfeng@zhangqingfeng:~$ docker version
  2. Client:
  3. Version: 18.06.1-ce
  4. API version: 1.38
  5. Go version: go1.10.3
  6. Git commit: e68fc7a
  7. Built: Tue Aug 21 17:24:56 2018
  8. OS/Arch: linux/amd64
  9. Experimental: false
  10. Server:
  11. Engine:
  12. Version: 18.06.1-ce
  13. API version: 1.38 (minimum version 1.12)
  14. Go version: go1.10.3
  15. Git commit: e68fc7a
  16. Built: Tue Aug 21 17:23:21 2018
  17. OS/Arch: linux/amd64
  18. Experimental: false

這里你可能使用sudo docker version作為命令,如果想去掉sudo,可以參考鏈接:https://www.jianshu.com/p/95e397570896

3.? 拉取hadoop鏡像,你可以選擇Docker Hub庫或者阿里云庫,我選的是阿里云庫,它有加速器

首先應該注冊:? 阿里云庫:https://cr.console.aliyun.com

????????????????????????????? Docker Hub庫: https://hub.docker.com/

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

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

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

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

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://lqbkkmob.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

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

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

zhangqingfeng@zhangqingfeng:~$ docker pull registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

b.?? 經過一段時間后,鏡像已經下載到本地計算機,可使用指令docker images查看是否下載成功:

  1. zhangqingfeng@zhangqingfeng:~$ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. 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

  1. zhangqingfeng@zhangqingfeng:~$ docker run -it --name Master -h Master registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
  2. [root@Master local]#

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

  1. [root@Master local]# zhangqingfeng@zhangqingfeng:~$
  2. zhangqingfeng@zhangqingfeng:~$

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

  1. zhangqingfeng@zhangqingfeng:~$ docker run -it --name Slave1 -h Slave1 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
  2. [root@Slave1 local]# zhangqingfeng@zhangqingfeng:~$
  3. zhangqingfeng@zhangqingfeng:~$ docker run -it --name Slave2 -h Slave2 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
  4. [root@Slave2 local]# zhangqingfeng@zhangqingfeng:~$
  5. zhangqingfeng@zhangqingfeng:~$

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

  1. zhangqingfeng@zhangqingfeng:~$ docker attach Master
  2. [root@Master local]#

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

  1. [root@Master local]# yum -y install vim
  2. .......過程省略
  3. Complete!
  4. [root@Master local]#

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

  1. [root@Master local]# yum -y install openssh-clients
  2. .......
  3. Complete!
  4. [root@Master local]# yum -y install openssh-server
  5. .......
  6. Complete!
  7. [root@Master local]

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

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

  1. [root@Master local]# /usr/sbin/sshd
  2. Could not load host key: /etc/ssh/ssh_host_rsa_key
  3. Could not load host key: /etc/ssh/ssh_host_ecdsa_key
  4. Could not load host key: /etc/ssh/ssh_host_ed25519_key
  5. sshd: no hostkeys available -- exiting.

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

  1. [root@Master local]# /usr/sbin/sshd-keygen -A
  2. /usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory
  3. Generating SSH2 RSA host key: /usr/sbin/sshd-keygen: line 63: success: command not found
  4. Generating SSH2 ECDSA host key: /usr/sbin/sshd-keygen: line 105: success: command not found
  5. Generating SSH2 ED25519 host key: /usr/sbin/sshd-keygen: line 126: success: command not found

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

  1. [root@Master local]# /usr/sbin/sshd
  2. [root@Master local]#

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

這時的錯誤參考鏈接為:https://blog.csdn.net/leon_wzm/article/details/78690439?utm_source=debugrun&utm_medium=referral

然后我們就開始制作密鑰了,輸入指令? ssh-keygen -t rsa?? ,然后都按? Enter? 鍵

  1. [root@Master local]# ssh-keygen -t rsa
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/root/.ssh/id_rsa):
  4. Created directory '/root/.ssh'.
  5. Enter passphrase (empty for no passphrase):
  6. Enter same passphrase again:
  7. Your identification has been saved in /root/.ssh/id_rsa.
  8. Your public key has been saved in /root/.ssh/id_rsa.pub.
  9. The key fingerprint is:
  10. SHA256:BPC1QSB9LcIro8HoVtPSFoHMvDjMqgmdkhCoi+M167c root@Master
  11. The key's randomart image is:
  12. +---[RSA 2048]----+
  13. |. + +=+o+. |
  14. |o = ++ooo. |
  15. |++. + o+o. |
  16. |+=o=o+.. |
  17. |=+o++o S |
  18. |Oo+o |
  19. |=+. o |
  20. |o. . . |
  21. | ...E. |
  22. +----[SHA256]-----+
  23. [root@Master local]#

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

  1. [root@Master local]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
  2. [root@Master local]#

此時,你可以使用指令?? cat /root/.ssh/authorized_keys?? 查看authorized_keys 文件中是否有你剛才存入的密鑰

  1. [root@Master local]# cat /root/.ssh/authorized_keys
  2. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnfGoobPBQlX38ePTP88oTWeYZvaR73ADrDPTyEEX6Fy4Og4IQcd6pq5g0vjUdVxCVnes7Us+CpKvPkrqjAqDPm/oY61jplDZCzxEG45kbHl06SY8X/+Km12PsKjOKWDJzCwTs1u0EnXL1UDmFePGhv/MJNPti+hM+itNM/QWfk6ObzFjDY6sGexe3zRqi9fdZLZVNFL3PPIfS0cHdA/Vw+8FXeEfFifTwRNwOVG9rKEsL2TyhCcynn4hRJ9AFwl18GvJn5eLxuPeVVuKn8yzGpDhVvuntdGVxCcGgaWiwyb/W8mtxozXP1C5fKkM6fghj46kK9MdtR14f49Tkc5JB root@Master
  3. [root@Master local]#

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

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

為了ssh鏈接時的美觀簡潔,我們配置其/etc/ssh/sshd_config? 文件,輸入指令?? vim? /etc/ssh/sshd_config? 進入編輯文件模式,

[root@Master local]# vim /etc/ssh/sshd_config

這里如果有同學不懂 vim 的使用,可以參考鏈接:https://blog.csdn.net/yu870646595/article/details/52045150

進去編輯文件之后,敲上 i ,此時進入編輯模式,按照我下面所列的代碼,找到它,并改成我這樣

  1. Port 22
  2. PermitRootLogin yes
  3. PubkeyAuthentication yes
  4. PasswordAuthentication yes
  5. ChallengeResponseAuthentication no
  6. UsePAM yes
  7. PrintLastLog no

然后按下? Esc 鍵,進入命令模式, 再敲上指令? :wq?? 退出這個編輯文件界面,回到Master容器界面

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

[root@Master local]# vim /etc/ssh/ssh_config 
StrictHostKeyChecking no

改完之后同樣敲上 Esc 鍵,進入命令模式, 再敲上指令? :wq?? 退出這個編輯文件界面,回到Master容器界面

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

  1. [root@Master local]# read escape sequence
  2. zhangqingfeng@zhangqingfeng:~$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
  3. /Master - 172.17.0.2
  4. /Slave1 - 172.17.0.3
  5. /Slave2 - 172.17.0.4
  6. zhangqingfeng@zhangqingfeng:~$

然后進入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

  1. zhangqingfeng@zhangqingfeng:~$ docker attach Master
  2. [root@Master local]# vim /etc/hosts
  1. 127.0.0.1 localhost
  2. ::1 localhost ip6-localhost ip6-loopback
  3. fe00::0 ip6-localnet
  4. ff00::0 ip6-mcastprefix
  5. ff02::1 ip6-allnodes
  6. ff02::2 ip6-allrouters
  7. 172.17.0.2 Master
  8. 172.17.0.3 Slave1
  9. 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的密碼,而這個密碼你輸入什么也不對。

這時的錯誤參考鏈接為:https://blog.csdn.net/kunlong0909/article/details/7284174

因為每個容器的? /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 地址

  1. [root@Master local]# ssh Slave1
  2. ssh: Could not resolve hostname slave1: Name or service not known
  3. [root@Master local]# ssh Slave2
  4. ssh: Could not resolve hostname slave2: Name or service not known

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

  1. [root@Master local]# ssh Slave1
  2. ssh: connect to host slave1 port 22: Connection refused
  3. [root@Master local]#
  4. [root@Master local]# ssh Slave2
  5. ssh: connect to host slave1 port 22: Connection refused
  6. [root@Master local]#

這時的錯誤參考鏈接為:https://blog.csdn.net/leon_wzm/article/details/78690439?utm_source=debugrun&utm_medium=referral

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

  1. [root@Master local]# ssh Slave1
  2. [root@Slave1 ~]#

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

  1. [root@Master local]# ssh Slave1
  2. [root@Slave1 ~]# logout
  3. Connection to slave1 closed.
  4. [root@Master local]# ssh Slave2
  5. [root@Slave2 ~]#
  6. [root@Slave2 ~]# logout
  7. Connection to slave1 closed.
  8. [root@Master local]#

③?? 假如你連接Slave1時,還提示了很多信息,不像我這樣簡潔,比如還有 LastLogin 之類的提示信息,那你肯定是每個容器的vim? /etc/ssh/sshd_config? 和? vim? /etc/ssh/ssh_config? 文件的配置沒有跟我的一樣,在上述步驟 g 中,會有這兩個文件的配置。

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

? 首先我們查看JAVA_HOME的地址,在 hadoop-env.sh 文件中,我們并不知道這個文件的具體路徑,沒關系,我們只需知道它的名字,使用指令? find / -name hadoop-env.sh?? 搜索它即可,(注意這時候我們目前是在Master容器界面里)

  1. [root@Master local]# find / -name hadoop-env.sh
  2. /usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
  3. [root@Master local]#

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

[root@Master 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.xml 和 yarn-site.xml 和 mapred-site.xml 及 hdfs-site.xml 文件

?? 首先使用 find / -name core-site.xml 的具體路徑,然后用指令? vim + 文件路徑? 進入這個文件

  1. [root@Master local]# find / -name core-site.xml
  2. /usr/local/hadoop-2.7.5/etc/hadoop/core-site.xml
  3. [root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/core-site.xml

里面的配置改成如下圖所示:然后 :wq 保存退出

  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>fs.defaultFS</name>
  5. <value>hdfs://Master:9000</value>
  6. </property>
  7. <property>
  8. <name>io.file.buffer.size</name>
  9. <value>131072</value>
  10. </property>
  11. <property>
  12. <name>hadoop.tmp.dir</name>
  13. <value>/usr/local/hadoop-2.7.5/tmp</value>
  14. </property>
  15. </configuration>

? 進入yarn-site.xml 進行配置,結束后保存退出。

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/yarn-site.xml
  1. limitations under the License. See accompanying LICENSE file.
  2. -->
  3. <configuration>
  4. <property>
  5. <name>yarn.nodemanager.aux-services</name>
  6. <value>mapreduce_shuffle</value>
  7. </property>
  8. <property>
  9. <name>yarn.resourcemanager.address</name>
  10. <value>Master:8032</value>
  11. </property>
  12. <property>
  13. <name>yarn.resourcemanager.scheduler.address</name>
  14. <value>Master:8030</value>
  15. </property>
  16. <property>
  17. <name>yarn.resourcemanager.resource-tracker.address</name>
  18. <value>Master:8031</value>
  19. </property>
  20. <property>
  21. <name>yarn.resourcemanager.admin.address</name>
  22. <value>Master:8033</value>
  23. </property>
  24. <property>
  25. <name>yarn.resourcemanager.webapp.address</name>
  26. <value>Master:8088</value>
  27. </property>
  28. <property>
  29. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  30. <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  31. </property>
  32. </configuration>

?? 進入mapred-site.xml? 進行配置,結束后保存退出

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/mapred-site.xml
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>mapreduce.framework.name</name>
  5. <value>yarn</value>
  6. </property>
  7. </configuration>

?? 進入hdfs-site.xml? 進行配置,結束后保存退出

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>dfs.replication</name>
  5. <value>2</value>
  6. </property>
  7. <property>
  8. <name>dfs.namenode.name.dir</name>
  9. <value>file:/usr/local/hadoop-2.7.5/hdfs/name</value>
  10. </property>
  11. </configuration>

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

[root@Slave1 local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>dfs.replication</name>
  5. <value>2</value>
  6. </property>
  7. <property>
  8. <name>dfs.datanode.data.dir</name>
  9. <value>file:/usr/local/hadoop-2.7.5/hdfs/data</value>
  10. </property>
  11. </configuration>

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

  1. [root@Master local]# ssh Slave1
  2. [root@Slave1 ~]# rm -rf /usr/local/hadoop-2.7.5/hdfs
  3. [root@Slave1 ~]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/data

② 在Slave1刪除并創建之后,我們 Ctrl+D 斷開與Slave1的ssh連接,然后 使用指令 ssh Slave2 與Slave2容器進行連接,與Slave1相同,我們需要把hdfs目錄刪除,并重新創建,結束之后我們 Ctrl+D 斷開與Slave2的連接,回到Master容器界面,代碼如下:

  1. [root@Slave1 ~]# logout
  2. Connection to slave1 closed.
  3. [root@Master local]# ssh Slave2
  4. [root@Slave2 ~]#
  5. [root@Slave2 ~]# rm -rf /usr/local/hadoop-2.7.5/hdfs
  6. [root@Slave2 ~]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/data
  7. [root@Slave2 ~]# logout
  8. Connection to slave1 closed.
  9. [root@Master local]#

③ Slave1和Slave2都已經刪除并重建 hdfs 目錄了,現在我們把Master容器也這么做,注意Master容器創建的是 name子文件,不再是 data 子文件里

  1. [root@Master local]# rm -rf /usr/local/hadoop-2.7.5/hdfs
  2. [root@Master local]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/name
  3. [root@Master local]#

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

  1. [root@Master local]# hdfs namenode -format
  2. ..........一堆代碼,此處省略
  3. [root@Master local]#

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

  1. [root@Master local]# find / -name sbin
  2. /usr/local/sbin
  3. /usr/local/hadoop-2.7.5/sbin
  4. /usr/local/spark-2.3.0-bin-hadoop2.7/sbin
  5. /usr/lib/debug/usr/sbin
  6. /usr/lib/debug/sbin
  7. /usr/sbin
  8. /sbin
  9. [root@Master local]# cd /usr/local/hadoop-2.7.5/sbin
  10. [root@Master sbin]#

②? 然后我們使用指令 ./start-all.sh? 來啟動集群

  1. [root@Master sbin]# ./start-all.sh
  2. This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
  3. Starting namenodes on [Master]
  4. Master: starting namenode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-namenode-Master.out
  5. Slave1: starting datanode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-datanode-Slave1.out
  6. Slave2: starting datanode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-datanode-Slave2.out
  7. Starting secondary namenodes [0.0.0.0]
  8. 0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-secondarynamenode-Master.out
  9. starting yarn daemons
  10. starting resourcemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn--resourcemanager-Master.out
  11. Slave1: starting nodemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn-root-nodemanager-Slave1.out
  12. Slave2: starting nodemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn-root-nodemanager-Slave2.out
  13. [root@Master sbin]#

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

  1. [root@Master sbin]# jps
  2. 192 NameNode
  3. 562 ResourceManager
  4. 824 Jps
  5. 392 SecondaryNameNode
  6. [root@Master sbin]#

④? 這里我們可以使用? ssh Slave1? (或ssh Slave2)進入Slave1容器,然后使用指令? jps? 查看datanode是否啟動,此時會出現

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

  1. [root@Master sbin]# ssh Slave1
  2. [root@Slave1 ~]# jps
  3. -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 ?? ,如圖所示:

  1. [root@Master local]# vim /etc/profile
  2. ....進入之后末尾添加下列代碼(根據自己的實際配置填寫,比如java版本可能每個人都不一樣)
  3. export JAVA_HOME=/usr/local/jdk1.8.0_162
  4. export HADOOP_HOME=/usr/local/hadoop-2.7.5
  5. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  6. .....保存退出后
  7. [root@Master local]# source /etc/profile

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

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

  1. [root@Master sbin]# hadoop dfsadmin -report
  2. DEPRECATED: Use of this script to execute hdfs command is deprecated.
  3. Instead use the hdfs command for it.
  4. Configured Capacity: 982232104960 (914.77 GB)
  5. Present Capacity: 901762801664 (839.83 GB)
  6. DFS Remaining: 901762752512 (839.83 GB)
  7. DFS Used: 49152 (48 KB)
  8. DFS Used%: 0.00%
  9. Under replicated blocks: 0
  10. Blocks with corrupt replicas: 0
  11. Missing blocks: 0
  12. Missing blocks (with replication factor 1): 0
  13. -------------------------------------------------
  14. Live datanodes (2):
  15. Name: 172.17.0.3:50010 (Slave1)
  16. Hostname: Slave1
  17. Decommission Status : Normal
  18. Configured Capacity: 491116052480 (457.39 GB)
  19. DFS Used: 24576 (24 KB)
  20. Non DFS Used: 15263760384 (14.22 GB)
  21. DFS Remaining: 450881376256 (419.92 GB)
  22. DFS Used%: 0.00%
  23. DFS Remaining%: 91.81%
  24. Configured Cache Capacity: 0 (0 B)
  25. Cache Used: 0 (0 B)
  26. Cache Remaining: 0 (0 B)
  27. Cache Used%: 100.00%
  28. Cache Remaining%: 0.00%
  29. Xceivers: 1
  30. Last contact: Tue Sep 18 03:58:01 UTC 2018
  31. Name: 172.17.0.4:50010 (Slave2)
  32. Hostname: Slave2
  33. Decommission Status : Normal
  34. Configured Capacity: 491116052480 (457.39 GB)
  35. DFS Used: 24576 (24 KB)
  36. Non DFS Used: 15263760384 (14.22 GB)
  37. DFS Remaining: 450881376256 (419.92 GB)
  38. DFS Used%: 0.00%
  39. DFS Remaining%: 91.81%
  40. Configured Cache Capacity: 0 (0 B)
  41. Cache Used: 0 (0 B)
  42. Cache Remaining: 0 (0 B)
  43. Cache Used%: 100.00%
  44. Cache Remaining%: 0.00%
  45. Xceivers: 1
  46. Last contact: Tue Sep 18 03:58:01 UTC 2018
  47. [root@Master sbin]#

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

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

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

  1. 0. 重啟docker服務
  2. sudo service docker restart
  3. 1.查看所有容器的ip
  4. docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq
  5. 2. 拉取一個鏡像
  6. docker pull <鏡像名稱>
  7. 3. 查看所有鏡像
  8. docker images
  9. 5. 查看正在運行的容器
  10. docker ps
  11. 6. 查看所有容器(包括正在運行和不在運行的容器)
  12. docker ps -a
  13. 7. 在鏡像里創建一個容器并以前臺交互模式啟動它
  14. docker run -it --name <容器名> -h <容器名> <鏡像名字> /bin/bash
  15. 8. 退出容器,但不關閉它(關閉之后還得啟動,并且設置的/etc/hosts內容都沒有了)
  16. Ctrl+P+Q
  17. 9. 再次進入容器
  18. docker attach <容器名>
  19. 10. 在容器內下載插件(使用yum)
  20. yum -y install <插件名>
  21. 11. 在容器內刪除插件(使用yum)
  22. yum remove <插件名>
  23. 12. 查找文件的路徑
  24. find / -name <文件名>
  25. 13. 進入文件
  26. cd <文件路徑>
  27. 14. 容器內編輯文件(使用vim)
  28. vim <文件路徑> -----打開文件
  29. i -----切換到編輯模式
  30. Esc -----切換到命令模式
  31. $ -----移到本行的最后
  32. /關鍵字 -----查找字符
  33. dd -----刪除光標所在行
  34. :q -----不保存退出
  35. :wq -----保存退出

本文參考鏈接還有:https://blog.csdn.net/Leafage_M/article/details/72633408

??????????????????????????????????? https://www.jianshu.com/p/3d5cc7165c15

??????????????????????????????????? https://blog.csdn.net/u013548453/article/details/80936027

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445370.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自然語言處理(2)-信息論基礎

自然語言處理-數學基礎概述1.信息論基礎1.1熵1.2 聯合熵和條件熵1.3 相對熵和交叉熵1.4 互信息和雙字耦合度1.5 噪聲信道模型概述 本系列文章計劃總結整理中國科學院大學宗成慶老師《自然語言處理》課程相關知識&#xff0c;參考數目《統計自然語言處理》-第二版&#xff0c;宗…

servlet基礎總結

什么是servlet Servlet&#xff08;Server Applet&#xff09;是Java Servlet的簡稱&#xff0c;是小服務程序或服務連接器&#xff0c;是用Java編寫的服務器端程序&#xff0c;主要功能在于交互式地瀏覽和修改數據&#xff0c;生成動態Web內容. 狹義的Servlet是指Java語言實…

大數據學習(3)- 分布式文件系統HDFS

文章目錄目錄1.分布式文件系統1.1 計算機集群概念1.2 分布式文件系統結構2.HDFS簡介2.1 HDFS設計的目標2.2HDFS的局限性2.3 塊的概念2.4 HDFS主要組件及其功能2.4.1 名稱節點2.4.2 第二名稱節點2.4.3 數據節點3.HDFS體系結構3.1 HDFS體系結構介紹3.2 HDFS體系結構的局限性4.HDF…

Python 圖片轉簡單字符畫

字符畫是一系列字符的組合&#xff0c;我們可以把字符看作是比較大塊的像素&#xff0c;一個字符能表現一種顏色&#xff08;暫且這么理解吧&#xff09;&#xff0c;字符的種類越多&#xff0c;可以表現的顏色也越多&#xff0c;圖片也會更有層次感。 灰度值&#xff1a;指黑…

大數據學習(4)--分布式數據庫HBase

文章目錄目錄1.HBase概述1.1BigTable1.2 HBase簡介1.3 HBase和傳統的關系型數據庫之間的區別2.HBase訪問接口3.HBase數據模型3.1 數據模型概述3.2 數據模型相關概念3.3 數據坐標3.4 概念視圖3.5 物理視圖3.6 面向列的存儲4.HBase的實現原理4.1 HBase功能組件4.2 表和region4.3 …

servlet中的數據存儲

在servlet基礎中&#xff0c;我們&#xff1a; 用以下幾種方式實現數據存儲和共享&#xff1a; 1&#xff09;在客戶端頁面和服務器端程序之間&#xff0c;用request中的getParameter()方法共享數據 2&#xff09;在請求和請求之間&#xff0c;可以用get/setAttribute方法來共…

Linux(2)-tar,find,grep,xargs

常用命令1. 打包壓縮/解包解壓縮 tar1.1 打包 tar -czvf xxx.tar.gz xxx1.2 解壓 tar -xzvf xxx.tar.gz2.文件/目錄搜索2.1 find文件/目錄查找2.2 grep文本匹配3. 復合命令3.1 > 重定向3.2 | 管道.shutdown1. 打包壓縮/解包解壓縮 tar tar和gzip是對黃金搭檔&#xff1a;ta…

Event Recommendation Engine Challenge(基礎版)---代碼

第一步&#xff1a;統計user和event相關信息 #查看train_csv的數據 import pandas as pd df_train pd.read_csv(train.csv) df_train.head()usereventinvitedtimestampinterestednot_interested03044012191877122502012-10-02 15:53:05.75400000:000013044012150228424802012…

servlet——三兄弟的另外兩個:過濾器/監聽器

過濾器 我們寫多了servlet會發現&#xff0c;很多代碼和功能是重復的&#xff0c;比如&#xff1a;解決中文亂碼問題、權限驗證、日志的記錄等&#xff0c;他們的特點是&#xff1a;代碼相同或相似、分散在不同位置、不利于維護。 過濾器就是他們的解決辦法。 過濾器是請求到…

矩陣論-線性變換的特征值與特征變換

線性空間與線性變換綜述1.2 線性變換及其矩陣1.2.3 特征值與特征向量綜述 本系列博文主要總結學習矩陣論的心得筆記&#xff0c;參考數目《矩陣論》–張凱院&#xff1b;整個文章的整理體系參照行書過程。 1.2 線性變換及其矩陣 1.2.3 特征值與特征向量 本節討論如何選擇線…

Python(1)-源起、設計目標、設計哲學、特點

python簡介1. python的起源2. 解釋器3. python 語言的設計目標4. python 語言的設計哲學5. Python 特點人生苦短&#xff0c;我用python–吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;1. python的起源 1989年吉多在圣誕節想寫一個新的解釋程序作為ABC語言的繼承者。…

kaggle(05)---Event Recommendation Engine Challenge(基礎版)

文章目錄目錄1.比賽相關介紹1.1 比賽介紹1.2 數據集介紹1.3 評價標準介紹1.4 個人理解2. 解決方案2.1 統計用戶和event信息2.2 計算用戶相似度2.3 用戶社交關系信息處理2.4 構建event和event相似度數據2.5 活躍度/event熱度數據2.6 構建特征2.7 模型構建和預測3. 遇到的問題4. …

多校一道KMP+DP的題

難啊&#xff0c;多校當時根本不會做 題目描述 White Cloud has a rectangle carpet of n*m. Grid (i,j) has a color colorA[i][j] and a cost costA[i][j]. White Rabbit will choose a subrectangle B of p*q from A and the color of each grid is colorB[0...p-1][0..…

Python(2)-第一個python程序、執行python程序三種方式

第一個Python 程序1. 第一個Python 程序2. 常用兩Python個版本3. 程序執行的三種方式3.1 解釋器3.2 交互式運行Python程序3.3 IDE&#xff08;集成開發環境&#xff09;-pycharm1. 第一個Python 程序 Python 源程序就是一個特殊格式的文本文件&#xff0c;所以可以采用任意的文…

推薦算法---FM,協同過濾

文章目錄目錄1.FM算法產生背景2.FM算法模型3.FM算法VS其他算法4.推薦算法總結目錄 1.FM算法產生背景 在傳統的線性模型如LR中&#xff0c;每個特征都是獨立的&#xff0c;如果需要考慮特征與特征直接的交互作用&#xff0c;可能需要人工對特征進行交叉組合&#xff1b;非線性…

借助桶排序思想完成的一道題

問題&#xff1a; 數組排序之后的相鄰數的最大差值&#xff1b; 嗯&#xff0c;你可以排序&#xff0c;然后找相鄰的最大差值。 但是你覺得這么簡單我寫他干啥。 最優解&#xff1a;時間復雜度O(N)&#xff0c;空間O(1) 那我們開始說這種方法&#xff1a; 1&#xff09;遍…

Python(3)-Pycharm基本使用技巧

初識Pycharm1.界面2.恢復初始設置3.第一次打開Pycharm4.打開一個項目5.設置解釋器的版本。6.新建項目7.編輯器、控制臺的字體設置Pycharm–適合于開發管理大型項目&#xff0c;項目是用以解決復雜功能的軟件。1.界面 導航區–主要有什么文件 編輯區–編輯具體的文件 控制臺窗口…

推薦算法概述(01)

1.什么是推薦系統 用戶沒有明確的需求&#xff0c;你需要的是一個自動化的工具&#xff0c;它可以分析你的歷史興趣&#xff0c;從龐大的電影庫中找到幾部符合你興趣的電影供你選擇。這個工具就是個性化推薦系統。 推薦系統的主要任務 推薦系統的任務就是聯系用戶和信息&…

CSDN-Markdown編輯器使用小技巧

Markdown編輯器使用小技巧1.圖片無法顯示1.圖片無法顯示 1.檢查圖片的命名格式是否正確&#xff0c;數字不能作為圖片名稱開頭&#xff0c;雖然window操作系統下能夠識別&#xff0c;但是導入圖片的時候會造成無法顯示的錯誤。