我參考了這篇博客,寫的很清楚不過還有一些漏洞:https://blog.csdn.net/qq_33530388/article/details/72811705
下面是我將一些錯(cuò)誤的地方修正了,給大家看。親測可用??!失敗的可以留言??!
首先線上個(gè)效果圖:

環(huán)境介紹:我的主機(jī)是win10,自帶16G,裝的虛擬機(jī)centos7,給了4G內(nèi)存。在centos7里面裝了docker,本章不介紹docker的安裝,如果想看的可以看我的其他文章
1.獲取鏡像。
如果是本地使用VMware搭建的話,需要準(zhǔn)備Java環(huán)境,hadoop安裝包,還要配置環(huán)境變量。雖然不難,但是經(jīng)常做這些工作也難免煩躁。
使用Docker容器的話,那這一切就變得簡單多了。
首先要準(zhǔn)備一個(gè)鏡像,可以使用Dockerfile構(gòu)建一個(gè)合適自己的鏡像,或者可以在共有倉庫中找一個(gè)具有hadoop環(huán)境的鏡像來使用也可以。由于我是配置的阿里云的加速器,所以在阿里云的倉庫中找了一個(gè)具有hadoop環(huán)境的鏡像。hadoop鏡像地址
使用命令拉到本地:
docker pull registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop
下載完成之后,通過docker images 可以查看到該鏡像:
2.創(chuàng)建容器。
有了鏡像之后,我們根據(jù)該鏡像創(chuàng)建三個(gè)容器,分別是一個(gè)Master用來作為hadoop集群的namenode,剩下兩個(gè)Slave用來作為datanode。
可以使用命令:
docker run -i -t --name Master -h Master -p 50070:50070 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash
命令中的-h為該容器設(shè)置了主機(jī)名,這里設(shè)置為Master,最好創(chuàng)建容器的時(shí)候就設(shè)置主機(jī)名,在容器內(nèi)部設(shè)置不生效。
–name指定了容器的名字,也是為了方便區(qū)分使用。
-p 是指定對(duì)外開放的端口50070,這是方便我們?cè)跒g覽器上訪問hdfs。原文中也有給出如何給運(yùn)行的容器開放端口映射,不過對(duì)我還是不好用
如果需要設(shè)置掛載的,可自行設(shè)置
建立好Master節(jié)點(diǎn)的容器之后,再分別使用兩次該命令,創(chuàng)建兩個(gè)Slave節(jié)點(diǎn)。稍微改變其中的參數(shù)即可:
例如創(chuàng)建Slave1節(jié)點(diǎn):
docker run -i -t --name Slave1 -h Slave1 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash
這樣集群的基本環(huán)境就準(zhǔn)備好了。
3.配置SSH。
如果是本地搭建的話,需要配置的大概分為三步:
1.配置java環(huán)境。
2.配置無秘SSH。
3.配置hadoop環(huán)境。
但是下載的鏡像已經(jīng)包含了這些內(nèi)容,我們只需要簡單的配置一下就可以使用了。
在這個(gè)鏡像中,有關(guān)java和hadoop的內(nèi)容都存放在了/opt/tools目錄下。
先查看下環(huán)境變量都包含了什么:
從中間可以看出包含了jdk和hadoop的bin目錄,所以我們可以直接使用這兩個(gè)命令。
java環(huán)境已經(jīng)不需要我們來配置了。
接下來配置一下無秘的SSH。
首先將SSH運(yùn)行起來。
/etc/init.d/ssh start
然后生成秘鑰,保存到authorized_keys中。這個(gè)地方可以看一下這篇博客:ssh-keygen 的 詳解
ssh-keygen -t rsa
執(zhí)行的總體過程如下:
接下來在兩個(gè)Slave節(jié)點(diǎn)中做相同的事情,并且將每個(gè)節(jié)點(diǎn)生成的秘鑰互相保存在authorized_keys中。
也就是說,三個(gè)節(jié)點(diǎn)的都是這個(gè)樣子的:
接下來查看一下各自節(jié)點(diǎn)的ip地址,但是如果直接使用熟悉的ifconfig時(shí),就會(huì)發(fā)現(xiàn)沒有這個(gè)命令。那是因?yàn)殓R像本身就比較簡潔,簡潔到連這個(gè)命令都沒有。。。這個(gè)我也是服。
可以使用ip addr查看,或者:apt-get install ifconfig net-tools,安裝相關(guān)命令。
相比之下還是ip addr方便點(diǎn):
然后修改/etc/hosts,將主機(jī)名和對(duì)應(yīng)的ip地址添加進(jìn)去,這樣做為了方便調(diào)用ssh:
如果在Master節(jié)點(diǎn),想要連接到Slave1節(jié)點(diǎn),可以使用:ssh 192.168.0.3,也可以使用ssh Slave1。很明顯能感覺到使用主機(jī)名比較方便理解使用。
如果使用ssh Slave1之后沒有提示需要輸入密碼,就代表成功了(第一次的話會(huì)讓輸入yes或者no,是為了記住該地址,如果輸入yes之后就可以直接連接就像下面這樣):
4.配置hadoop。
到現(xiàn)在為止,我們已經(jīng)準(zhǔn)備好了haoop搭建的所有基本工作。也是由于該Docker鏡像為我們準(zhǔn)備好了需要才會(huì)這么簡單的。
我們只需要在配置一下hadoop相關(guān)的內(nèi)容。
為了方便起見,我們可以直接在Master節(jié)點(diǎn)進(jìn)行配置,然后使用scp命令發(fā)送到各節(jié)點(diǎn)覆蓋原來的即可。
這里不廢話,直接上代碼,至于其中的意思可以參考書籍資料,或者查看這個(gè)文檔:hadoop安裝指南,這個(gè)文檔是在VMware上配置的。
hadoop-env.sh:修改有關(guān)java的環(huán)境
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>
slaves
Master
Slave1
Slave2
所以我這里datanode有3個(gè),每個(gè)節(jié)點(diǎn)各一個(gè),namenode只有一個(gè),在Master上
相關(guān)目錄最好需要手動(dòng)創(chuàng)建,然后分發(fā)給其他節(jié)點(diǎn)上
mkdir /hadoop/data
mkdir /hadoop/name
mkdir /hadoop/tmp
scp -r hadoop root@Slave1:/
scp -r hadoop root@Slave2:/
然后將這些文件通過scp發(fā)送到各個(gè)Slave節(jié)點(diǎn)上覆蓋原來的文件:
scp core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml yarn-site.xml Slave1:/opt/tools/hadoop/etc/hadoop/
到這里為止,所有的準(zhǔn)備工作都做好了。
5.運(yùn)行hadoop。
進(jìn)行格式化操作:
hadoop namenode -format
啟動(dòng)集群:
使用./start-all.sh,如果啟動(dòng)過程中提示關(guān)于0.0.0.0地址輸入yes或no,輸入yes即可:
在Master上使用jps查看相關(guān)進(jìn)程是否啟動(dòng):
在Slave節(jié)點(diǎn)上使用jps查看相關(guān)進(jìn)程是否啟動(dòng):
使用命令查看各節(jié)點(diǎn)信息:hadoop dfsadmin -report
然后再運(yùn)行一個(gè)統(tǒng)計(jì)單詞的例子:
現(xiàn)在hsfs上創(chuàng)建一個(gè)文件夾:
hadoop fs -mkdir /input
查看該文件夾:
hadoop fs -ls /
上傳文件到hdfs,這里直接將當(dāng)前目錄的README.txt進(jìn)行上傳:
hadoop fs -put README.txt /input/
之后運(yùn)行相關(guān)例子:
在/opt/tools/hadoop/share/hadoop/mapreduce目錄中執(zhí)行:hadoop jar hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
注意下這里我之前已經(jīng)做過測試了,所有outout目錄已經(jīng)存在了,所以換成了output1,這個(gè)目錄不需要提前創(chuàng)建,運(yùn)行的時(shí)候指定一下,會(huì)自動(dòng)創(chuàng)建的。
查看相關(guān)結(jié)果輸出:
可以使用: hadoop fs -cat /output1/part-r-00000 查看一下統(tǒng)計(jì)結(jié)果: