docker環境下搭建hadoop叢集(ubuntu16.04 LTS系統)
- 我的思路是這樣:
安裝ubuntu系統---->下載docker---->在docker里拉取hadoop映象---->在此映象裡建立三個容器(Master、Slave1、Slave2)---->完成完全分散式
1. 安裝ubuntu系統(無論你是安裝的單系統,還是用虛擬機器安裝了ubuntu)
如果想安裝單系統,步驟如下:
(1) 把ubuntu映象下載到電腦桌面(版本自選)。
(2) 再把ultraiso下載到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_config和vim /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.xml 和 yarn-site.xml 和 mapred-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 -----儲存退出