Hadoop是一個(gè)大數(shù)據(jù)的框架,當(dāng)代大數(shù)據(jù)的痛點(diǎn)在于大量數(shù)據(jù)的采集、存儲(chǔ)與計(jì)算。Hadoop解決了后兩個(gè)問題,主要提供海量數(shù)據(jù)的存儲(chǔ)與計(jì)算功能,所以備受青睞。

一、大數(shù)據(jù)的特點(diǎn)
大數(shù)據(jù)擁有“4V”的特點(diǎn),不過我最近查到的資料說是已經(jīng)有“5V”了。
-
大容量(Volume)
我們所說的大數(shù)據(jù)一般指數(shù)量級(jí)在PB(1024T)、EB(1024PB)、ZB(1024EB)等級(jí)的數(shù)據(jù)。 -
高增長(zhǎng)速度(Velocity)
數(shù)據(jù)增長(zhǎng)速度快,處理速度也快,時(shí)效性要求高。比如搜索引擎要求幾分鐘前的新聞能夠被用戶查詢到,個(gè)性化推薦算法盡可能要求實(shí)時(shí)完成推薦。這是大數(shù)據(jù)區(qū)別于傳統(tǒng)數(shù)據(jù)挖掘的顯著特征。 -
數(shù)據(jù)多樣性(Variety)
種類和來源多樣化。包括結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),具體表現(xiàn)為網(wǎng)絡(luò)日志、音頻、視頻、圖片、地理位置信息等等,多類型的數(shù)據(jù)對(duì)數(shù)據(jù)的處理能力提出了更高的要求。 -
低密度價(jià)值(Value)
數(shù)據(jù)量大,但有價(jià)值的數(shù)據(jù)很少,需要通過計(jì)算與處理來提取出有價(jià)值的部分。 -
真實(shí)性(Veracity)
數(shù)據(jù)的準(zhǔn)確性和可信賴度,即數(shù)據(jù)的質(zhì)量。
二、Hadoop簡(jiǎn)介
Hadoop基礎(chǔ)信息
Hadoop是Apache基金會(huì)開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。
??一個(gè)視頻存儲(chǔ)在一臺(tái)電腦上叫單機(jī)存儲(chǔ),如果將視頻分為三部分,分別存儲(chǔ)在三臺(tái)機(jī)器上,這就叫分布式存儲(chǔ)。Hadoop主要解決了海量數(shù)據(jù)的存儲(chǔ)與分析計(jì)算的問題。
??廣義上來說,Hadoop是指Hadoop生態(tài)圈,即圍繞Hadoop框架來運(yùn)行的其他程序所構(gòu)成的一個(gè)生態(tài)系統(tǒng)。如HDFS、HBASE、HIVE、ZooKeeper等。

Hadoop的三大發(fā)行版
cloudera公司的CDH,是最先對(duì)開源Hadoop進(jìn)行封裝的發(fā)行版。
Hortonworks公司的HDP,第二個(gè)對(duì)開源Hadoop進(jìn)行封裝的發(fā)行版。
后來cloudera與Hortonworks收購合并,推出最新也最貴的CDP發(fā)行版。(單節(jié)點(diǎn),一年一萬美金)
不過我發(fā)現(xiàn)HDP是免費(fèi)的啊,包括Ambari。我下載使用的時(shí)候也沒管我要錢啊。
Hadoop的優(yōu)勢(shì)
- 高可靠性
數(shù)據(jù)在同集群的多臺(tái)機(jī)器上存在多個(gè)副本,一塊甚至多塊硬盤損壞并不影響實(shí)際數(shù)據(jù)。3.0版本的Hadoop增加了糾刪碼機(jī)制,以前一個(gè)數(shù)據(jù)完全拷貝3次,磁盤使用率是?,現(xiàn)在多占用原始數(shù)據(jù)的40%磁盤存儲(chǔ)校驗(yàn)碼,原始數(shù)據(jù)在一定范圍內(nèi)的損壞都可以根據(jù)校驗(yàn)碼還原,增加了磁盤使用率。 - 高擴(kuò)展性
可以動(dòng)態(tài)添加、刪除機(jī)器。 - 高效性
在MapReduce的思想下,Hdaoop是并行工作的,以加快任務(wù)處理速度。 - 高容錯(cuò)性
Hadoop能夠自動(dòng)將失敗的任務(wù)重新分配。
Hadoop的迭代與組成變化
-
Hadoop 1.x時(shí)代
MapReduce負(fù)責(zé)計(jì)算與資源調(diào)度、HDFS負(fù)責(zé)數(shù)據(jù)存儲(chǔ)、Common是輔助工具。 -
Hadoop 2.x時(shí)代
MapReduce負(fù)責(zé)計(jì)算、Yarn負(fù)責(zé)資源調(diào)度、HDFS負(fù)責(zé)數(shù)據(jù)存儲(chǔ)、Common是輔助工具。 -
Hadoop 3.x時(shí)代
在3.x時(shí)代,Hadoop的組成與2.x時(shí)代沒有區(qū)別,但是增加了新的功能及特性,如糾刪碼,能配置多個(gè)NameNode等。
HDFS架構(gòu)
-
HDFS(Hadoop Distributed File System)是分布式文件系統(tǒng)。
??HDFS包含NameNode和DataNode,分布式存儲(chǔ)時(shí)需要有一個(gè)節(jié)點(diǎn)負(fù)責(zé)記錄每一個(gè)文件存儲(chǔ)在哪個(gè)節(jié)點(diǎn)上,這個(gè)節(jié)點(diǎn)就是NameNode節(jié)點(diǎn)。而下面每一個(gè)存儲(chǔ)真實(shí)數(shù)據(jù)的節(jié)點(diǎn)就是DataNode。
??這種情況下如果NameNode節(jié)點(diǎn)死掉了,整個(gè)集群就無法對(duì)外提供服務(wù)了,因?yàn)檎l也不知道數(shù)據(jù)存哪個(gè)節(jié)點(diǎn)上了,所以有一個(gè)2NN的節(jié)點(diǎn),專門輔助NameNode。
NameNode存儲(chǔ)元數(shù)據(jù),如文件名、文件目錄結(jié)構(gòu)、文件屬性(生成時(shí)間、文件權(quán)限、副本數(shù)等),以及每個(gè)塊列表與塊所在的DataNode。
??DataNode在本地文件系統(tǒng)存儲(chǔ)文件塊數(shù)據(jù),以及塊數(shù)據(jù)的校驗(yàn)和。
??SecondaryNameNode(2NN)負(fù)責(zé)每過一段時(shí)間對(duì)NameNode元數(shù)據(jù)備份。
-
YARN(Yet Another Resource Negotiator)負(fù)責(zé)資源調(diào)度
??YARN主要負(fù)責(zé)資源調(diào)度,如CPU與內(nèi)存。其中包含ResourceManager(RM)、NodeManager(NM)、ApplicationMastrt(AM)還有Container(容器)。
??RM是整個(gè)集群的資源調(diào)度老大,NM是各個(gè)數(shù)據(jù)節(jié)點(diǎn)的資源調(diào)度老大,AM是單個(gè)任務(wù)的資源調(diào)度者,當(dāng)多個(gè)客戶端發(fā)起任務(wù)時(shí)RM會(huì)在數(shù)據(jù)節(jié)點(diǎn)上生成容器,容器中的資源由AM管理,同時(shí)AM會(huì)向RM申請(qǐng)資源,RM會(huì)根據(jù)NM的資源情況進(jìn)行分配,如果當(dāng)前節(jié)點(diǎn)資源不足,而AM依然申請(qǐng)更多資源的時(shí)候,RM會(huì)將任務(wù)分配到其他節(jié)點(diǎn)上運(yùn)行,從而使用其他節(jié)點(diǎn)的空閑資源。當(dāng)任務(wù)結(jié)束時(shí),容器會(huì)被釋放,資源歸還給NM。
??需要注意的是,客戶端可以是多個(gè),訪問RM時(shí)會(huì)分配多個(gè)AM,一個(gè)數(shù)據(jù)節(jié)點(diǎn)上可以運(yùn)行多個(gè)AM,每個(gè)NM上可以有多個(gè)容器在運(yùn)行,容器默認(rèn)的內(nèi)存范圍是1-8G,CPU默認(rèn)最低1個(gè)。
-
MapReduce
MapReduce是大數(shù)據(jù)的計(jì)算部分,他分為Map和Reduce兩個(gè)階段。
Map階段并行處理輸入數(shù)據(jù)。
Reduce階段對(duì)Map結(jié)果進(jìn)行匯總。
具體運(yùn)行邏輯比較復(fù)雜,暫時(shí)不細(xì)研究。
三、Hadoop簡(jiǎn)單部署與使用
1.環(huán)境準(zhǔn)備
我準(zhǔn)備的環(huán)境
??三臺(tái)虛擬機(jī),每臺(tái)虛擬機(jī)的配置為2C3G,硬盤50G,操作系統(tǒng)為centos7.6,無UI界面的最小安裝。
需要jdk和hadoop環(huán)境,配置好hostname,以及hosts文件。
- 修改主機(jī)名
推薦使用hostnamectl去修改,他會(huì)一并修改配置文件與靜態(tài)主機(jī)名。
[root@localhost /]# hostnamectl set-hostname hadoop101
- 修改hosts文件
hadoop集群中使用主機(jī)域名來通信,所以需要配置hosts,并指定全限定主機(jī)名
[root@hadoop101 /]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.163.101 hadoop101 hadoop101.nb
192.168.163.102 hadoop102 hadoop102.nb
192.168.163.103 hadoop103 hadoop103.nb
- 安裝jdk
上傳jdk的tar包到虛擬機(jī)/opt/package目錄下(其實(shí)路徑隨意),此步驟不予展示。
然后解壓jdk包到/opt下
[root@hadoop101 package]# tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/
- 安裝hadoop
上傳hadoop的tar包到虛擬機(jī)/opt/package目錄下(其實(shí)路徑隨意),此步驟不予展示。
然后解壓hadoop包到/opt下
[root@hadoop101 package]# tar -zxvf hadoop-3.1.3.tar.gz -C /opt/
其中hadoop的bin目錄中有一些后面重點(diǎn)學(xué)習(xí)會(huì)經(jīng)常使用的命令,分別是hdfs,yarn和mapred。
還有常用的配置文件,在hadoop安裝路徑/etc/hadoop文件夾中,重要配置有core-site.xml,hdfs-site.xml,mapred-site.xml和yarn-site.xml。
- 配置環(huán)境變量
將hadoop和jdk的環(huán)境變量配置到/etc/profile中,并執(zhí)行source /etc/profile使其生效。
[root@hadoop103 opt]# tail -9 /etc/profile
#jdk環(huán)境變量
export JAVA_HOME=/opt/jdk1.8.0_221
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#hadoop環(huán)境變量
export HADOOP_HOME=/opt/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 免密互信
hadoop環(huán)境內(nèi)的三臺(tái)機(jī)器最好都配置免密互信,可以是root用戶,也可以是普通用戶。教學(xué)視頻上沒說為什么一定要這樣做,但是……做了吧。
這里我用一臺(tái)機(jī)器舉例子,首先需要?jiǎng)?chuàng)建這臺(tái)機(jī)器自己的ssh密鑰對(duì),分公鑰與私鑰,然后將自己的公鑰復(fù)制給其他機(jī)器。
先創(chuàng)建密鑰對(duì),執(zhí)行命令后一路回車即可。
[eops@hadoop102 ~]# 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:k3+EzQArxSszuVms1DnDt1AUCGRdVbQvj5m6car4NTQ root@hadoop102
The key's randomart image is:
+---[RSA 2048]----+
| .++o++o.oo |
| . .+o. . |
| .=.+. . |
| *.@..= . |
| . OS=..E . .|
| + o.o . * |
| . = = .|
| . o * |
| ..o.+. |
+----[SHA256]-----+
然后復(fù)制自己的公鑰到其他機(jī)器上,三臺(tái)機(jī)器互相都要做。
[eops@hadoop102 ~]$ ssh-copy-id 192.168.163.102
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.163.102 (192.168.163.102)' can't be established.
ECDSA key fingerprint is SHA256:YmdUMxmmKBnAqQEquZdNvfO5PKABYpzBIrSHiLHPBA8.
ECDSA key fingerprint is MD5:dd:99:1c:4e:89:84:14:fe:b0:a5:9d:69:2a:ad:ea:d9.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
eops@192.168.163.102's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.163.102'"
and check to make sure that only the key(s) you wanted were added.
最后可以登錄驗(yàn)證一下,應(yīng)該只需要輸入一次yes,我下面這次連yes都沒讓我輸入,因?yàn)橹耙呀?jīng)保存過主機(jī)信息了,以后連接時(shí)連yes也不用輸入了。
[eops@hadoop102 ~]# ssh 192.168.163.102
Last failed login: Wed Nov 10 17:20:09 CST 2021 from hadoop102 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed Nov 10 17:18:05 2021
[eops@hadoop102 ~]#
- 防火墻配置
一般安裝時(shí)都要求關(guān)閉防火墻,但是我偏不,因?yàn)樵谡鎸?shí)的生產(chǎn)環(huán)境中,一般都禁止關(guān)閉防火墻,防火墻是服務(wù)器防護(hù)的一道重要關(guān)卡,沒了他服務(wù)器就是在裸奔,如果服務(wù)器是公網(wǎng)服務(wù)器,那你就完蛋了!
不過也可以關(guān)閉防火墻,畢竟練習(xí)嘛,無所謂,還能省去不少麻煩。
給三臺(tái)機(jī)器都配置防火墻規(guī)則。
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.101" accept'
success
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.102" accept'
success
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.103" accept'
success
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.1" accept'
success
[root@hadoop101 ~]# firewall-cmd --reload
success
我是在虛擬機(jī)里配置的,所以除了集群內(nèi)的三臺(tái),還要給宿主機(jī)開放訪問權(quán)限,同時(shí)為了能用主機(jī)名訪問url,我還更改了宿主機(jī)的hosts文件,就不展示了。
最后一定記得重新加載防火墻配置,否則不生效。
- 時(shí)間同步
時(shí)間同步這里先不說了,主要就是集群中挑選一臺(tái)機(jī)器安裝ntp,然后其他機(jī)器使用netdate定時(shí)向ntp服務(wù)同步時(shí)間。如果只是練習(xí)hadoop的話,這里暫時(shí)不配置也行。
2.hadoop運(yùn)行方式
- 本地模式
也就是單機(jī)模式,數(shù)據(jù)存儲(chǔ)在linux服務(wù)器本地,用來演示及測(cè)試官方案例。 - 偽分布式
本質(zhì)也是單機(jī)運(yùn)行,不過數(shù)據(jù)存儲(chǔ)在HDFS上,同時(shí)具備集群的所有功能,用一臺(tái)機(jī)器模擬一個(gè)分布式環(huán)境。 - 完全分布式
多臺(tái)服務(wù)器組成的集群環(huán)境。
3.簡(jiǎn)單執(zhí)行hadoop程序
hadoop的程序可以調(diào)用命令行簡(jiǎn)單執(zhí)行并獲取結(jié)果,比如對(duì)一個(gè)文本中的單詞進(jìn)行詞頻統(tǒng)計(jì)。
首先需要一個(gè)文檔用來存儲(chǔ)單詞
[root@hadoop101 input]# pwd
/tmp/input
[root@hadoop101 input]# ls
test.txt
[root@hadoop101 input]# cat test.txt
aa hh
bb dd
cc ss
aa ff
ee
ff
ee
我創(chuàng)建了一個(gè)/tmp/input文件夾,作為輸入目錄,其中存儲(chǔ)數(shù)據(jù)本身,然后執(zhí)行hadoop命令
[root@hadoop101 input]# hadoop jar /opt/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /tmp/input/test.txt /tmp/output/test1
命令中使用hadoop執(zhí)行jar包,后面是jar包的全路徑(相對(duì)路徑也可以),然后執(zhí)行此jar包中的wordcount程序,這個(gè)程序需要兩個(gè)參數(shù),輸入路徑與輸出路徑,其中輸出路徑必須不存在,否則會(huì)報(bào)錯(cuò)。
執(zhí)行過程略,結(jié)果就是會(huì)在輸出路徑中生成兩個(gè)文件。
[root@hadoop101 test1]# pwd
/tmp/output/test1
[root@hadoop101 test1]# ls
part-r-00000 _SUCCESS
[root@hadoop101 test1]# cat part-r-00000
aa 2
bb 1
cc 1
dd 1
ee 2
ff 2
hh 1
ss 1
文件夾中的_SUCCESS為標(biāo)志文件,只表示執(zhí)行結(jié)果的成功與否,前面的part-r-00000才是執(zhí)行后的輸出內(nèi)容。
4.hadoop集群的搭建
現(xiàn)在三臺(tái)機(jī)器上的環(huán)境都搭建好了,接下來說一下各個(gè)機(jī)器的組件分配情況。
| hadoop101 | hadoop102 | hadoop103 | |
|---|---|---|---|
| HDFS | NameNode、DataNode | DataNode | SecondaryNameNode(2NN)、DataNode |
| YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
這里需要注意,NameNode與2NN不能安裝在一臺(tái)機(jī)器上,因?yàn)樗麄兌己芎膬?nèi)存,放在一起會(huì)有資源搶奪的情況出現(xiàn)。
ResourceManager也比較耗內(nèi)存,不要與NameDode和2NN裝在一臺(tái)機(jī)器上。
YARN的NodeManager是每臺(tái)機(jī)器都要裝的,而DateNode盡量每臺(tái)都裝,可以最大化機(jī)器資源的利用。
不過以上只是建議,執(zhí)意全裝一臺(tái)機(jī)器上也沒問題。
另外,我看的視頻中提到過,2NN在NN失效時(shí)會(huì)自動(dòng)切換,這是不對(duì)的,2NN不具備自動(dòng)切換功能,他只是用于修復(fù)NN的工具,并不能在NN失效時(shí)代替NN維持集群運(yùn)行。
4.1 修改配置文件
接下來需要按照上面的主機(jī)規(guī)劃修改配置文件,修改集群內(nèi)一臺(tái),然后將配置文件拷貝到其余主機(jī)上。讓整個(gè)集群內(nèi)的配置文件相同。
hadoop的所有配置文件均在安裝目錄下的etc/hadoop中
先修改核心配置文件core-site.xml
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<!-- hdfs的數(shù)據(jù)存放路徑 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hdfs/</value>
</property>
<!-- 配置hdfs網(wǎng)頁登錄時(shí)的靜態(tài)用戶為ovo -->
<!-- <property>
<name>hadoop.http.staticuser.user</name>
<value>ovo</value>
</property> -->
</configuration>
上面core-site.xml的配置中需要注意一點(diǎn),被注釋的部分為“配置hdfs網(wǎng)頁登錄時(shí)的靜態(tài)用戶”,我注釋掉是因?yàn)檫@個(gè)要看你的實(shí)際需求。
正常使用任意用戶向hdfs上傳文件時(shí),hdfs里的文件就所屬于上傳這個(gè)文件的用戶,其他用戶不能刪除這個(gè)用戶上傳的文件。正常不配置這里的話,使用ovo用戶啟動(dòng)hadoop集群之后,網(wǎng)頁上是不可以刪除文件的,會(huì)報(bào)權(quán)限不足的錯(cuò)誤,如果不希望別人在網(wǎng)頁端刪除文件則不做配置即可。
如果配置了ovo用戶,則ovo用戶上傳的文件可以在網(wǎng)頁端刪除。
然后是hdfs-site.xml,這里要注意下,2NN的地址配置的是dfs.namenode.secondary.http-address,是http,不是https,如果寫錯(cuò)了,2NN將在啟動(dòng)集群的那個(gè)節(jié)點(diǎn)上運(yùn)行,配置就無效了。
<configuration>
<!-- NameNode的web訪問地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop101:9870</value>
</property>
<!-- 2NN的地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
</configuration>
接下來是yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定mr走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 配置ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!-- 環(huán)境變量的繼承,據(jù)說是個(gè)bug,升級(jí)版的hadoop中不需要配置這個(gè) -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
還有mapred-site.xml
<configuration>
<!-- 讓mapreduce程序運(yùn)行在yarn上,讓其受yarn調(diào)度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
最后是workers,這個(gè)文件要注意,它配置的是集群內(nèi)的主機(jī)域名,每一行結(jié)尾都不能有空格,也不允許有空行。
hadoop101
hadoop102
hadoop103
別忘了分發(fā)配置文件到集群內(nèi)所有主機(jī)上。
4.2 初始化NameNode
第一次啟動(dòng)集群時(shí),需要在NameNode所在機(jī)器上執(zhí)行初始化命令,該命令會(huì)生成新的集群ID,如果在集群運(yùn)行中執(zhí)行初始化命令,會(huì)導(dǎo)致NameNode與DataNode的集群ID不一致,從而造成集群找不到以往數(shù)據(jù)的嚴(yán)重問題。如果集群運(yùn)行中出現(xiàn)故障,需要重新初始化,則必須先停止NameNode與DataNode進(jìn)程,并且刪除所有機(jī)器的data與logs目錄,然后再進(jìn)行初始化。
初始化NameNode,注意,要在規(guī)劃中namenode所在機(jī)器上執(zhí)行,不可以在其他機(jī)器上執(zhí)行。
[ovo@hadoop101 ~]$ hdfs namenode -format
4.3 啟動(dòng)集群
這里我將hadoop的啟動(dòng)用戶修改為了ovo,我將hadoop的文件夾與data文件夾的權(quán)限都修改了,整個(gè)初始化過程較長(zhǎng),不截圖和復(fù)制了,如果報(bào)錯(cuò)會(huì)直接輸出在終端。
然后啟動(dòng)集群。注意,要用hadoop文件的所屬用戶去啟動(dòng)集群。同時(shí),在任意一臺(tái)機(jī)器上執(zhí)行啟動(dòng)命令都可以,與NameNode的初始化過程不同。
[ovo@hadoop101 sbin]$ pwd
/opt/hadoop-3.1.3/sbin
[ovo@hadoop101 sbin]$ ./start-dfs.sh
Starting namenodes on [hadoop101]
Starting datanodes
Starting secondary namenodes [hadoop103]
啟動(dòng)集群過程中可能會(huì)報(bào)錯(cuò),我在啟動(dòng)時(shí)就報(bào)了一個(gè)找不到JAVA_HOME環(huán)境變量的錯(cuò)誤,但實(shí)際上我的主機(jī)都配置好了jdk環(huán)境變量,只是hadoop無法獲取到,經(jīng)過簡(jiǎn)單的搜索之后發(fā)現(xiàn)缺少了一個(gè)配置。
需要修改/opt/hadoop-3.1.3/etc/hadoop/hadoop-env.sh文件中大約第54行,export JAVA_HOME=后面的值,該行默認(rèn)是注釋掉的,而且等號(hào)后是空。將其取消注釋,并改成你的JAVA_HOME的值。
啟動(dòng)hadoop集群后可以通過jps命令查看到正在運(yùn)行的hadoop進(jìn)程。該命令使用-v的參數(shù)可以查看java進(jìn)程的全路徑。
hadoop101
[ovo@hadoop101 sbin]$ jps
7479 NameNode
7630 DataNode
7854 Jps
hadoop102
[ovo@hadoop102 hdfs]$ jps
5349 DataNode
5400 Jps
hadoop103
[ovo@hadoop103 hdfs]$ jps
4486 DataNode
4583 SecondaryNameNode
4617 Jps
4.4 啟動(dòng)Yarn
接著需要啟動(dòng)yarn,注意,ResourceManager規(guī)劃在哪臺(tái)機(jī)器上,就要在哪臺(tái)機(jī)器上執(zhí)行啟動(dòng)yarn的命令,這與NameNode的初始化方式相同,都必須在特定的機(jī)器上執(zhí)行。
[ovo@hadoop102 sbin]$ ./start-yarn.sh
Starting resourcemanager
Starting nodemanagers
[ovo@hadoop102 sbin]$ jps
6626 Jps
5349 DataNode
6185 ResourceManager
6314 NodeManager
使用jps命令查看其他節(jié)點(diǎn)的NodeManager是否啟動(dòng)。
4.5 可視化網(wǎng)頁
啟動(dòng)后的NameNode和Yarn都是可以在web頁面訪問的,路徑就是配置文件中配置的。
NameNode訪問url:http://hadoop101:9870
Yarn的ResourceManager:http://hadoop102:8088
如下圖:


4.6 hdfs的web頁面
hdfs就是一個(gè)文件系統(tǒng),你可以把他當(dāng)做linux的文件系統(tǒng)那樣去理解,他也包含文件和文件夾,也有對(duì)應(yīng)的權(quán)限認(rèn)證。
注意,之后的所有命令都要使用hadoop的安裝用戶去操作,hdfs的權(quán)限認(rèn)證與linux的權(quán)限認(rèn)證是有相關(guān)性的。
下面就是創(chuàng)建文件夾,并且上傳小文件與大文件的示例。
#創(chuàng)建文件夾
[ovo@hadoop101 hadoop]$ hadoop fs -mkdir /temp_input
[ovo@hadoop101 hadoop]$
#查看文件夾內(nèi)容
[ovo@hadoop101 hadoop]$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - ovo supergroup 0 2021-11-22 14:55 /temp_input
[ovo@hadoop101 hadoop]$
#上傳小文件
[ovo@hadoop101 hadoop]$ hadoop fs -put /tmp/Heaven.txt /temp_input
2021-11-22 15:07:36,918 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[ovo@hadoop101 hadoop]$
[ovo@hadoop101 hadoop]$ hadoop fs -ls /temp_input
Found 1 items
-rw-r--r-- 3 ovo supergroup 80 2021-11-22 15:07 /temp_input/Heaven.txt
[ovo@hadoop101 hadoop]$
#上傳大文件
[ovo@hadoop101 package]$ hadoop fs -put /opt/package/jdk-8u221-linux-x64.tar.gz /
2021-11-22 15:24:25,088 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-11-22 15:24:27,704 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[ovo@hadoop101 package]$
上傳后可以在web頁面上查看到路徑下都有什么文件。


4.7 hdfs的文件位置及yarn查看任務(wù)調(diào)度
現(xiàn)在我們知道了如何在web頁面查看文件,但文件本身還是存儲(chǔ)在服務(wù)器上的,如果想要查看文件的具體位置,則需要進(jìn)到一下目錄查看。
存儲(chǔ)文件的具體位置就在core-site.xml中配置的數(shù)據(jù)存放路徑下,但是真實(shí)文件存放的位置要更深一些。
[root@hadoop101 subdir0]# pwd
/data/hdfs/dfs/data/current/BP-428193404-192.168.163.101-1637543150736/current/finalized/subdir0/subdir0
[root@hadoop101 subdir0]#
[root@hadoop101 subdir0]# ls
blk_1073741825 blk_1073741825_1001.meta blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta
可以查看一下blk_1073741825這個(gè)文件,會(huì)發(fā)現(xiàn)他就是我上傳到集群中的文本。
[root@hadoop101 subdir0]# cat blk_1073741825
Heaven
Heaven does not exist.
Over.
ps.Elohim, the scientist from the planet?
而另外兩個(gè)blk_1073741826和blk_1073741827其實(shí)就是上傳jdk壓縮包,甚至可以拼成一個(gè)tar.gz的壓縮文件(拼湊的文件后綴必須和上傳時(shí)相同),然后再解壓都行。
[root@hadoop101 subdir0]# ls
blk_1073741825 blk_1073741825_1001.meta blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta
[root@hadoop101 subdir0]#
[root@hadoop101 subdir0]# cat blk_1073741826 >> jdk.tar.gz
[root@hadoop101 subdir0]# cat blk_1073741827 >> jdk.tar.gz
[root@hadoop101 subdir0]# tar -zxf jdk.tar.gz
[root@hadoop101 subdir0]# ls
blk_1073741825 blk_1073741825_1001.meta blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta jdk1.8.0_221 jdk.tar.gz
還記得之前yarn的web頁面嗎,目前只是上傳和下載了文件,沒有對(duì)文件進(jìn)行操作,所以不會(huì)有任務(wù),web頁面上也不會(huì)有記錄,此時(shí)再次執(zhí)行一下wordcount的命令,統(tǒng)計(jì)一下詞頻。
這次執(zhí)行命令時(shí)使用的是hdfs集群的方式,所以輸入路徑與輸出路徑都要寫hdfs的路徑。
[ovo@hadoop101 ~]$ hadoop jar /opt/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /temp_input /temp_output
執(zhí)行成功后能看到輸出路徑下多了相應(yīng)的文件與內(nèi)容。

同時(shí)還可以在yarn的任務(wù)調(diào)度頁面查看到這個(gè)任務(wù)。

這次頁面上就有任務(wù)了,橫向拉倒最后有個(gè)需要注意的地方。

上圖的History是任務(wù)歷史,這里暫時(shí)點(diǎn)不開,因?yàn)闆]有配置歷史服務(wù)器。
4.8 集群崩潰處理辦法
hadoop集群不論多少臺(tái)機(jī)器,多少個(gè)DateNode,對(duì)于上傳的數(shù)據(jù)默認(rèn)都是存儲(chǔ)三份做冗余,只要有一臺(tái)機(jī)器上的數(shù)據(jù)與DataNode都完好無損,則集群可以對(duì)外提供服務(wù)。如果A機(jī)器DataNode完好,但數(shù)據(jù)損壞,而B機(jī)器數(shù)據(jù)完好但DataNode未在運(yùn)行,則該文件不可下載。
但如果數(shù)據(jù)與DataNode全損,且數(shù)據(jù)不重要,只需要集群立刻恢復(fù)功能的話,則可以停止集群所有進(jìn)程,先停止yarn,然后停止hdfs集群,再刪除集群內(nèi)所有機(jī)器上的,配置文件中配置的數(shù)據(jù)存儲(chǔ)路徑下的全部?jī)?nèi)容,以及HDAOOP_HOME路徑中l(wèi)ogs的文件夾,然后重新在NameNode節(jié)點(diǎn)上執(zhí)行初始化命令,再啟動(dòng)hdfs集群和yarn。
這樣這個(gè)集群就是全新的。
4.9 配置歷史服務(wù)器
修改mapred-site.xml
<configuration>
<!-- 讓mapreduce程序運(yùn)行在yarn上,讓其受yarn調(diào)度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 歷史服務(wù)器配置 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 歷史服務(wù)器web訪問地址 -->
<property>
<name>mapreduce.jobhistory.wabapp.address</name>
<value>hadoop102:19888</value>
</property>
</configuration>
配置中下面的web訪問地址才是我們?cè)跒g覽器上輸入的地址。然后重新啟動(dòng)yarn進(jìn)程。
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/stop-yarn.sh
Stopping nodemanagers
hadoop103: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
hadoop102: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
啟動(dòng)后會(huì)發(fā)現(xiàn)并沒有history相關(guān)的進(jìn)程,是因?yàn)檫@個(gè)歷史服務(wù)器的進(jìn)程需要手動(dòng)開啟。
執(zhí)行命令:
[ovo@hadoop102 hadoop]$ mapred --daemon start historyserver
[ovo@hadoop102 hadoop]$ jps
12128 NodeManager
12787 JobHistoryServer
10537 DataNode
11998 ResourceManager
12846 Jps
然后之前點(diǎn)不開的那個(gè)History的按鈕就可以點(diǎn)開了,頁面如下:

或者可以直接訪問瀏覽器頁面。http://hadoop102:19888/

4.10 配置日志聚合
如果想查看任務(wù)執(zhí)行的日志,可以點(diǎn)擊如下位置查看,但在沒有配置日志聚集的情況下是無法在這里查看日志的。


為了查看任務(wù)執(zhí)行過程,我們需要配置日志聚集,將分散在多個(gè)服務(wù)器上的日志收集到一起方便用戶查看。
需要修改yarn-site.xml配置文件。在configuration標(biāo)簽中添加以下內(nèi)容
<!-- 開啟日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 設(shè)置日志聚集服務(wù)器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 設(shè)置日志保留時(shí)間,單位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
然后停止歷史服務(wù)器,并重啟yarn相關(guān)的所有進(jìn)程。
[ovo@hadoop102 hadoop]$ mapred --daemon stop historyserver
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/stop-yarn.sh
Stopping nodemanagers
hadoop102: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
[ovo@hadoop102 hadoop]$ jps
14130 Jps
10537 DataNode
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
[ovo@hadoop102 hadoop]$ mapred --daemon start historyserver
舊任務(wù)的日志是沒有了,但是配置好之后的新任務(wù)會(huì)有日志,所以再次執(zhí)行一個(gè)wordcount的命令,讓其產(chǎn)生一個(gè)新的任務(wù),然后再查看。這個(gè)命令上面執(zhí)行過兩次了,就不演示了,直接放任務(wù)的日志。

四、小知識(shí)
1.塊(block)
hadoop對(duì)數(shù)據(jù)的存儲(chǔ)有個(gè)單位,叫做“塊”(block),默認(rèn)情況下一個(gè)block的大小是128M。
當(dāng)存儲(chǔ)的文件小于128M時(shí),他占用的實(shí)際內(nèi)存就是文件大小,他只用了一個(gè)塊中的一部分。
當(dāng)存儲(chǔ)的文件大于128M時(shí),他將先占用滿一個(gè)block,剩余部分再繼續(xù)占用另外一個(gè)塊。
2.hadoop常用端口(均可自定義)
| 端口 | hadoop 2.X | hadoop 3.X |
|---|---|---|
| NameNode內(nèi)部通訊端口 | 8020/9000 | 8020/9000/9820 |
| NameNode Web頁面端口 | 50070 | 9870 |
| MapReduce查看任務(wù)執(zhí)行端口 | 8088 | 8088 |
| 歷史服務(wù)器通信端口 | 19888 | 19888 |
五、結(jié)語
hadoop的入門就到這里,簡(jiǎn)單的使用與搭建部署就算入門了,之后還會(huì)有對(duì)各個(gè)部分具體詳細(xì)的文章,不過先讓我把入門的這部分練習(xí)好,環(huán)境搭建和對(duì)配置文件的更改要多做多練習(xí),不然忘得很快的。