大数据学习(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,如下圖所示:
這里你可能使用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,然后輸入以下代碼:
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-hadoopb.?? 經過一段時間后,鏡像已經下載到本地計算機,可使用指令docker images查看是否下載成功:
c.?? 這時,我們要在這個hadoop鏡像里創建三個容器(Master、Slave1、Slave2),敲上如下指令:(我們先把三個容器創建出來,再慢慢里面添加配置)docker run -it --name Master -h Master registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
d. ? 此時把Master空的容器創建出來了,當然里面什么也沒配置,這時候敲上Ctrl+P+Q,會返回到初始目錄,并且不會退出Master容器,假如你按下Ctrl+C,也會退出到初始目錄,但是,這時候也把Master容器退出了,敲上Ctrl+P+Q后會出現下面情景,代碼如下:
e.?? 修改一下代碼的容器名,依次創建出容器Slave1和容器Slave2:
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
我們先下載vim,敲上指令? yum -y install vim
再把openssh-clients和openssh-server下載下來,注意按我說的順序下載,先下openssh-clients
g.? 這時我們配置Master容器的ssh密鑰
先執行指令? /usr/sbin/sshd,會出現下列情景
再執行指令??? /usr/sbin/sshd-keygen -A? ,出現下列情景
再次輸入一遍?? /usr/sbin/sshd?? 即可
上述三步必不可少,不然會出現?? 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? 鍵
生成的密鑰如圖所示存在? /root/.ssh/id_rsa.pub? 文件中了,我們需要把密鑰存儲在 /root/.ssh/authorized_keys? 文件中,指令是: cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys??
此時,你可以使用指令?? cat /root/.ssh/authorized_keys?? 查看authorized_keys 文件中是否有你剛才存入的密鑰
到這里,你的Master容器的ssh已經配好了,可以使用指令? ssh localhost? 驗證一下? ,敲上之后,需要再輸入 yes,雖然有warning,但是不用管它,帶回配置了? /etc/ssh/sshd_config? 文件就什么警告也沒了,驗證完了 敲上 Ctrl+D即可斷開與localhost的ssh連接
為了ssh鏈接時的美觀簡潔,我們配置其/etc/ssh/sshd_config? 文件,輸入指令?? vim? /etc/ssh/sshd_config? 進入編輯文件模式,
[root@Master local]這里如果有同學不懂 vim 的使用,可以參考鏈接:https://blog.csdn.net/yu870646595/article/details/52045150
進去編輯文件之后,敲上 i ,此時進入編輯模式,按照我下面所列的代碼,找到它,并改成我這樣
然后按下? Esc 鍵,進入命令模式, 再敲上指令? :wq?? 退出這個編輯文件界面,回到Master容器界面
再敲上指令? vim? /etc/ssh/ssh_config ? ,找到 ?StrictHostKeyChecking no? (大約在第35行) ,將以前的? # 去掉,并把? ask? 改成? no
[root@Master local] StrictHostKeyChecking no改完之后同樣敲上 Esc 鍵,進入命令模式, 再敲上指令? :wq?? 退出這個編輯文件界面,回到Master容器界面
這時候按下Ctrl+P+Q,返回到初始目錄,查看此時三個容器的ip地址,輸入命令: docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)?
然后進入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
至此,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 地址
②?? 假如你出現下面錯誤,那么你肯定沒在退出每個容器前 敲上指令 /usr/sbin/sshd? ,看上述13個步驟的紅字,很重要!
這時的錯誤參考鏈接為:https://blog.csdn.net/leon_wzm/article/details/78690439?utm_source=debugrun&utm_medium=referral
現在我們終于可以成功的驗證了,現在 Master 容器中連接? Slave1 ,指令是ssh Slave1????? 如下圖:
由圖可知,成功了,敲上 Ctrl +D 斷開與 Slave1 的連接 ,再驗證與 Slave2? 的連接,指令是 ssh? Slave2? ,成功后,Ctrl+D斷開與 Slave2 的連接。
③?? 假如你連接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容器界面里)
我們 用指令 vim /usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh? 進入這個文件,看到JAVA_HOME這一行,記錄它的路徑然后退出這個文件即可:
[root@Master local] 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 + 文件路徑? 進入這個文件
里面的配置改成如下圖所示:然后 :wq 保存退出
③? 進入yarn-site.xml 進行配置,結束后保存退出。
[root@Master local]④?? 進入mapred-site.xml? 進行配置,結束后保存退出
[root@Master local]⑤?? 進入hdfs-site.xml? 進行配置,結束后保存退出
[root@Master local]J.?? 在步驟I 中是配置 Master 容器的環境變量,我們還需要進入Slave1容器,相同的代碼把 Slave1的環境變量也配置完,當然容器slave2也是如此。唯一不同的是在步驟⑤ 的hdfs-site.xml中,Master容器設置的是namenode,而Slave1和Slave2設置的是datanode,如下圖:
[root@Slave1 local]K.?? ①現在我們在Master容器中通過ssh連接Slave1(或Slave2),刪除其hdfs所有目錄 (這個目錄就在剛才的hdfs-site.xml文件中,忘了的話你再vim打開它,把datanode保存的路徑記下來,我的是 /usr/local/hadoop-2.7.5/hdfs/data) ,并重新創建,代碼如下。因為下一步的格式化只能用一次,用兩次的話就需要用到這一步,為了保險,我們在第一次就直接用這一步,以免不必要的麻煩。
② 在Slave1刪除并創建之后,我們 Ctrl+D 斷開與Slave1的ssh連接,然后 使用指令 ssh Slave2 與Slave2容器進行連接,與Slave1相同,我們需要把hdfs目錄刪除,并重新創建,結束之后我們 Ctrl+D 斷開與Slave2的連接,回到Master容器界面,代碼如下:
③ Slave1和Slave2都已經刪除并重建 hdfs 目錄了,現在我們把Master容器也這么做,注意Master容器創建的是 name子文件,不再是 data 子文件里
L.?? 現在我們格式化 NameNode HDFS 目錄, 在Master容器中,使用指令 hdfs namenode -format
M.?? ①我們需要進入sbin 文件,來啟動hadoop 集群,我們不清楚 sbin 文件的具體路徑,所以我們可以使用 指令 find / -name sbin? 找到路徑,然后 cd +路徑?? 進入這個路徑。
②? 然后我們使用指令 ./start-all.sh? 來啟動集群
③? 使用 jps 查看 namenode 是否啟動,此時看的是Master容器的namenode是否啟動。
④? 這里我們可以使用? ssh Slave1? (或ssh Slave2)進入Slave1容器,然后使用指令? jps? 查看datanode是否啟動,此時會出現
-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 ?? ,如圖所示:
每個容器都配置結束后,我們再通過ssh進入其他容器,便可以使用? jps 或 hadoop fs xx 指令了。
⑤ 我們可以使用指令 hadoop dfsadmin -report?? 查看其他容器有沒有啟動
到此,我們的docker環境下的hadoop集群已經搭建成功!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后,我想奉上在搭建過程中用到的命令
本文參考鏈接還有:https://blog.csdn.net/Leafage_M/article/details/72633408
??????????????????????????????????? https://www.jianshu.com/p/3d5cc7165c15
??????????????????????????????????? https://blog.csdn.net/u013548453/article/details/80936027
總結
以上是生活随笔為你收集整理的大数据学习(2-2)- 使用docker安装配置Hadoop环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《机器学习实战》笔记(02):k-近邻算
- 下一篇: 《Unity2018入门与实战》笔记(9