大數(shù)據(jù)離線階段02:Apache Hadoop
Apache Hadoop
Hadoop介紹
Hadoop是Apache旗下的一個(gè)用java語(yǔ)言實(shí)現(xiàn)開源軟件框架,是一個(gè)開發(fā)和運(yùn)行處理大規(guī)模數(shù)據(jù)的軟件平臺(tái)。允許使用簡(jiǎn)單的編程模型在大量計(jì)算機(jī)集群上對(duì)大型數(shù)據(jù)集進(jìn)行分布式處理。

狹義上說(shuō),Hadoop指Apache這款開源框架,它的核心組件有:
HDFS(分布式文件系統(tǒng)):解決海量數(shù)據(jù)存儲(chǔ)
YARN(作業(yè)調(diào)度和集群資源管理的框架):解決資源任務(wù)調(diào)度
MAPREDUCE(分布式運(yùn)算編程框架):解決海量數(shù)據(jù)計(jì)算

廣義上來(lái)說(shuō),Hadoop通常是指一個(gè)更廣泛的概念——Hadoop生態(tài)圈。

當(dāng)下的Hadoop已經(jīng)成長(zhǎng)為一個(gè)龐大的體系,隨著生態(tài)系統(tǒng)的成長(zhǎng),新出現(xiàn)的項(xiàng)目越來(lái)越多,其中不乏一些非Apache主管的項(xiàng)目,這些項(xiàng)目對(duì)HADOOP是很好的補(bǔ)充或者更高層的抽象。
Hadoop發(fā)展簡(jiǎn)史
Hadoop是Apache Lucene創(chuàng)始人 Doug Cutting 創(chuàng)建的。最早起源于Nutch,它是Lucene的子項(xiàng)目。Nutch的設(shè)計(jì)目標(biāo)是構(gòu)建一個(gè)大型的全網(wǎng)搜索引擎,包括網(wǎng)頁(yè)抓取、索引、查詢等功能,但隨著抓取網(wǎng)頁(yè)數(shù)量的增加,遇到了嚴(yán)重的可擴(kuò)展性問(wèn)題:如何解決數(shù)十億網(wǎng)頁(yè)的存儲(chǔ)和索引問(wèn)題。
2003年Google發(fā)表了一篇論文為該問(wèn)題提供了可行的解決方案。論文中描述的是谷歌的產(chǎn)品架構(gòu),該架構(gòu)稱為:谷歌分布式文件系統(tǒng)(GFS),可以解決他們?cè)诰W(wǎng)頁(yè)爬取和索引過(guò)程中產(chǎn)生的超大文件的存儲(chǔ)需求。
2004年 Google發(fā)表論文向全世界介紹了谷歌版的MapReduce系統(tǒng)。
同時(shí)期,Nutch的開發(fā)人員完成了相應(yīng)的開源實(shí)現(xiàn)HDFS和MAPREDUCE,并從Nutch中剝離成為獨(dú)立項(xiàng)目HADOOP,到2008年1月,HADOOP成為Apache頂級(jí)項(xiàng)目,迎來(lái)了它的快速發(fā)展期。
2006年Google發(fā)表了論文是關(guān)于BigTable的,這促使了后來(lái)的Hbase的發(fā)展。
因此,Hadoop及其生態(tài)圈的發(fā)展離不開Google的貢獻(xiàn)。
Hadoop特性優(yōu)點(diǎn)
擴(kuò)容能力(Scalable):Hadoop是在可用的計(jì)算機(jī)集群間分配數(shù)據(jù)并完成計(jì)算任務(wù)的,這些集群可用方便的擴(kuò)展到數(shù)以千計(jì)的節(jié)點(diǎn)中。
成本低(Economical):Hadoop通過(guò)普通廉價(jià)的機(jī)器組成服務(wù)器集群來(lái)分發(fā)以及處理數(shù)據(jù),以至于成本很低。
高效率(Efficient):通過(guò)并發(fā)數(shù)據(jù),Hadoop可以在節(jié)點(diǎn)之間動(dòng)態(tài)并行的移動(dòng)數(shù)據(jù),使得速度非常快。
可靠性(Rellable):能自動(dòng)維護(hù)數(shù)據(jù)的多份復(fù)制,并且在任務(wù)失敗后能自動(dòng)地重新部署(redeploy)計(jì)算任務(wù)。所以Hadoop的按位存儲(chǔ)和處理數(shù)據(jù)的能力值得人們信賴。
Hadoop國(guó)內(nèi)外應(yīng)用
不管是國(guó)內(nèi)還是國(guó)外,Hadoop最受青睞的行業(yè)是互聯(lián)網(wǎng)領(lǐng)域,可以說(shuō)互聯(lián)網(wǎng)公司是hadoop的主要使用力量。
國(guó)外來(lái)說(shuō),Yahoo、Facebook、IBM等公司都大量使用hadoop集群來(lái)支撐業(yè)務(wù)。比如:
Yahoo的Hadoop應(yīng)用在支持廣告系統(tǒng)、用戶行為分析、支持Web搜索等。
Facebook主要使用Hadoop存儲(chǔ)內(nèi)部日志與多維數(shù)據(jù),并以此作為報(bào)告、分析和機(jī)器學(xué)習(xí)的數(shù)據(jù)源。
國(guó)內(nèi)來(lái)說(shuō),BAT領(lǐng)頭的互聯(lián)網(wǎng)公司是當(dāng)仁不讓的Hadoop使用者、維護(hù)者。比如Ali云梯(14年國(guó)內(nèi)最大Hadoop集群)、百度的日志分析平臺(tái)、推薦引擎系統(tǒng)等。

國(guó)內(nèi)其他非互聯(lián)網(wǎng)領(lǐng)域也有不少hadoop的應(yīng)用,比如:
金融行業(yè): 個(gè)人征信分析
證券行業(yè): 投資模型分析
交通行業(yè): 車輛、路況監(jiān)控分析
電信行業(yè): 用戶上網(wǎng)行為分析
總之:hadoop并不會(huì)跟某種具體的行業(yè)或者某個(gè)具體的業(yè)務(wù)掛鉤,它只是一種用來(lái)做海量數(shù)據(jù)分析處理的工具。
Hadoop集群搭建
發(fā)行版本
Hadoop發(fā)行版本分為開源社區(qū)版和商業(yè)版。
社區(qū)版是指由Apache軟件基金會(huì)維護(hù)的版本,是官方維護(hù)的版本體系。
https://hadoop.apache.org/

商業(yè)版Hadoop是指由第三方商業(yè)公司在社區(qū)版Hadoop基礎(chǔ)上進(jìn)行了一些修改、整合以及各個(gè)服務(wù)組件兼容性測(cè)試而發(fā)行的版本,比較著名的有cloudera的CDH、mapR、hortonWorks等。
https://www.cloudera.com/products/open-source/apache-hadoop/key-cdh-components.html

Hadoop的版本很特殊,是由多條分支并行的發(fā)展著。大的來(lái)看分為3個(gè)大的系列版本:1.x、2.x、3.x。
Hadoop1.0由一個(gè)分布式文件系統(tǒng)HDFS和一個(gè)離線計(jì)算框架MapReduce組成。架構(gòu)落后,已經(jīng)淘汰。
Hadoop 2.0則包含一個(gè)分布式文件系統(tǒng)HDFS,一個(gè)資源管理系統(tǒng)YARN和一個(gè)離線計(jì)算框架MapReduce。相比于Hadoop1.0,Hadoop 2.0功能更加強(qiáng)大,且具有更好的擴(kuò)展性、性能,并支持多種計(jì)算框架。

Hadoop 3.0相比之前的Hadoop 2.0有一系列的功能增強(qiáng)。目前已經(jīng)趨于穩(wěn)定,可能生態(tài)圈的某些組件還沒有升級(jí)、整合完善。

我們課程中使用的是:Apache Hadoop 3.3.0。
集群簡(jiǎn)介
HADOOP集群具體來(lái)說(shuō)包含兩個(gè)集群:HDFS集群和YARN集群,兩者邏輯上分離,但物理上常在一起。
HDFS集群負(fù)責(zé)海量數(shù)據(jù)的存儲(chǔ),集群中的角色主要有:
NameNode、DataNode、SecondaryNameNode
YARN集群負(fù)責(zé)海量數(shù)據(jù)運(yùn)算時(shí)的資源調(diào)度,集群中的角色主要有:
ResourceManager、NodeManager

那mapreduce是什么呢?它其實(shí)是一個(gè)分布式運(yùn)算編程框架,是應(yīng)用程序開發(fā)包,由用戶按照編程規(guī)范進(jìn)行程序開發(fā),后打包運(yùn)行在HDFS集群上,并且受到Y(jié)ARN集群的資源調(diào)度管理。
Hadoop部署方式分三種,Standalone mode(獨(dú)立模式)、Pseudo-Distributed mode(偽分布式模式)、Cluster mode(群集模式),其中前兩種都是在單機(jī)部署。
獨(dú)立模式又稱為單機(jī)模式,僅1個(gè)機(jī)器運(yùn)行1個(gè)java進(jìn)程,主要用于調(diào)試。
偽分布模式也是在1個(gè)機(jī)器上運(yùn)行HDFS的NameNode和DataNode、YARN的 ResourceManger和NodeManager,但分別啟動(dòng)單獨(dú)的java進(jìn)程,主要用于調(diào)試。
集群模式主要用于生產(chǎn)環(huán)境部署。會(huì)使用N臺(tái)主機(jī)組成一個(gè)Hadoop集群。這種部署模式下,主節(jié)點(diǎn)和從節(jié)點(diǎn)會(huì)分開部署在不同的機(jī)器上。
我們以3節(jié)點(diǎn)為例進(jìn)行搭建,角色分配如下:
node1 ? ? NameNode ? DataNode ? ?ResourceManager
node2 ? ? DataNode ? NodeManager ?SecondaryNameNode
node3 ? ?DataNode ?NodeManager
服務(wù)器基礎(chǔ)環(huán)境準(zhǔn)備
JDK環(huán)境安裝
Hadoop重新編譯
Hadoop官方一般都給出了對(duì)應(yīng)版本安裝包,一般情況下是不需要自己進(jìn)行編譯的,但是由于官方編譯好的hadoop的安裝包沒有提供帶C程序訪問(wèn)的接口,所以在使用本地庫(kù)(本地庫(kù)可以用來(lái)做壓縮,以及支持C程序等等)的時(shí)候就會(huì)出問(wèn)題,因此生產(chǎn)環(huán)境中,一般會(huì)重新編譯。
此外,作為開源軟件,針對(duì)源碼進(jìn)行修改某些屬性,之后也需要重編譯。
可以使用課程提供編譯好的安裝包。
Hadoop安裝包目錄結(jié)構(gòu)
解壓hadoop-3.3.0-Centos7-64-with-snappy.tar.gz,目錄結(jié)構(gòu)如下:
bin:Hadoop最基本的管理腳本和使用腳本的目錄,這些腳本是sbin目錄下管理腳本的基礎(chǔ)實(shí)現(xiàn),用戶可以直接使用這些腳本管理和使用Hadoop。
etc:Hadoop配置文件所在的目錄,包括core-site,xml、hdfs-site.xml、mapred-site.xml等從Hadoop1.0繼承而來(lái)的配置文件和yarn-site.xml等Hadoop2.0新增的配置文件。
include:對(duì)外提供的編程庫(kù)頭文件(具體動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)在lib目錄中),這些頭文件均是用C++定義的,通常用于C++程序訪問(wèn)HDFS或者編寫MapReduce程序。
lib:該目錄包含了Hadoop對(duì)外提供的編程動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),與include目錄中的頭文件結(jié)合使用。
libexec:各個(gè)服務(wù)對(duì)用的shell配置文件所在的目錄,可用于配置日志輸出、啟動(dòng)參數(shù)(比如JVM參數(shù))等基本信息。
sbin:Hadoop管理腳本所在的目錄,主要包含HDFS和YARN中各類服務(wù)的啟動(dòng)/關(guān)閉腳本。
share:Hadoop各個(gè)模塊編譯后的jar包所在的目錄,官方自帶示例。
Hadoop配置文件修改
Hadoop安裝主要就是配置文件的修改,一般在主節(jié)點(diǎn)進(jìn)行修改,完畢后scp下發(fā)給其他各個(gè)從節(jié)點(diǎn)機(jī)器。
hadoop-env.sh
文件中設(shè)置的是Hadoop運(yùn)行時(shí)需要的環(huán)境變量。JAVA_HOME是必須設(shè)置的,即使我們當(dāng)前的系統(tǒng)中設(shè)置了JAVA_HOME,它也是不認(rèn)識(shí)的,因?yàn)镠adoop即使是在本機(jī)上執(zhí)行,它也是把當(dāng)前的執(zhí)行環(huán)境當(dāng)成遠(yuǎn)程服務(wù)器。
core-site.xml
hadoop的核心配置文件,有默認(rèn)的配置項(xiàng)core-default.xml。
core-default.xml與core-site.xml的功能是一樣的,如果在core-site.xml里沒有配置的屬性,則會(huì)自動(dòng)會(huì)獲取core-default.xml里的相同屬性的值。
hdfs-site.xml
HDFS的核心配置文件,有默認(rèn)的配置項(xiàng)hdfs-default.xml。
hdfs-default.xml與hdfs-site.xml的功能是一樣的,如果在hdfs-site.xml里沒有配置的屬性,則會(huì)自動(dòng)會(huì)獲取hdfs-default.xml里的相同屬性的值。
mapred-site.xml
MapReduce的核心配置文件,有默認(rèn)的配置項(xiàng)mapred-default.xml。
mapred-default.xml與mapred-site.xml的功能是一樣的,如果在mapred-site.xml里沒有配置的屬性,則會(huì)自動(dòng)會(huì)獲取mapred-default.xml里的相同屬性的值。
yarn-site.xml
YARN的核心配置文件,有默認(rèn)的配置項(xiàng)yarn-default.xml。
yarn-default.xml與yarn-site.xml的功能是一樣的,如果在yarn-site.xml里沒有配置的屬性,則會(huì)自動(dòng)會(huì)獲取yarn-default.xml里的相同屬性的值。
workers
workers文件里面記錄的是集群主機(jī)名。主要作用是配合一鍵啟動(dòng)腳本如start-dfs.sh、stop-yarn.sh用來(lái)進(jìn)行集群?jiǎn)?dòng)。這時(shí)候workers文件里面的主機(jī)標(biāo)記的就是從節(jié)點(diǎn)角色所在的機(jī)器。
scp同步安裝包
在node1上進(jìn)行了配置文件的修改,使用scp命令將修改好之后的安裝包同步給集群中的其他節(jié)點(diǎn)。
Hadoop環(huán)境變量
3臺(tái)機(jī)器都需要配置環(huán)境變量文件。
Hadoop集群?jiǎn)?dòng)、初體驗(yàn)
啟動(dòng)方式
要啟動(dòng)Hadoop集群,需要啟動(dòng)HDFS和YARN兩個(gè)集群。
注意:首次啟動(dòng)HDFS時(shí),必須對(duì)其進(jìn)行格式化操作。本質(zhì)上是一些清理和準(zhǔn)備工作,因?yàn)榇藭r(shí)的HDFS在物理上還是不存在的。
hadoop namenode -format
單節(jié)點(diǎn)逐個(gè)啟動(dòng)
在主節(jié)點(diǎn)上使用以下命令啟動(dòng)HDFS NameNode:
$HADOOP_HOME/bin/hdfs --daemon start namenode
在每個(gè)從節(jié)點(diǎn)上使用以下命令啟動(dòng)HDFS DataNode:
$HADOOP_HOME/bin/hdfs --daemon start datanode
在node2上使用以下命令啟動(dòng)HDFS SecondaryNameNode:
$HADOOP_HOME/bin/hdfs --daemon start secondarynamenode
在主節(jié)點(diǎn)上使用以下命令啟動(dòng)YARN ResourceManager:
$HADOOP_HOME/bin/yarn --daemon start resourcemanager
在每個(gè)從節(jié)點(diǎn)上使用以下命令啟動(dòng)YARN nodemanager:
$HADOOP_HOME/bin/yarn --daemon start nodemanager
如果想要停止某個(gè)節(jié)點(diǎn)上某個(gè)角色,只需要把命令中的start改為stop即可。
腳本一鍵啟動(dòng)
如果配置了etc/hadoop/workers和ssh免密登錄,則可以使用程序腳本啟動(dòng)所有Hadoop兩個(gè)集群的相關(guān)進(jìn)程,在主節(jié)點(diǎn)所設(shè)定的機(jī)器上執(zhí)行。
hdfs:$HADOOP_PREFIX/sbin/start-dfs.sh
yarn: $HADOOP_PREFIX/sbin/start-yarn.sh
停止集群:stop-dfs.sh、stop-yarn.sh
集群web-ui
一旦Hadoop集群?jiǎn)?dòng)并運(yùn)行,可以通過(guò)web-ui進(jìn)行集群查看,如下所述:
NameNodehttp://nn_host:port/默認(rèn)9870.
ResourceManagerhttp://rm_host:port/默認(rèn) 8088.


Hadoop初體驗(yàn)
HDFS使用
從Linux本地上傳一個(gè)文本文件到hdfs的/test/input目錄下
hadoop fs -mkdir -p /wordcount/input
hadoop fs -put /root/somewords.txt ?/test/input
運(yùn)行mapreduce程序
在Hadoop安裝包的share/hadoop/mapreduce下有官方自帶的mapreduce程序。我們可以使用如下的命令進(jìn)行運(yùn)行測(cè)試。
示例程序jar:
hadoop-mapreduce-examples-3.3.0.jar
計(jì)算圓周率:
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 20 50
關(guān)于圓周率的估算,感興趣的可以查詢資料Monte Carlo方法來(lái)計(jì)算Pi值。
MapReduce jobHistory
JobHistory用來(lái)記錄已經(jīng)finished的mapreduce運(yùn)行日志,日志信息存放于HDFS目錄中,默認(rèn)情況下沒有開啟此功能,需要在mapred-site.xml中配置并手動(dòng)啟動(dòng)。
修改mapred-site.xml
查看歷史服務(wù)器已經(jīng)運(yùn)行完的Mapreduce作業(yè)記錄的web地址,需要啟動(dòng)該服務(wù)才行
分發(fā)配置到其他機(jī)器
cd /export/servers/hadoop-3.3.0/etc/hadoop
scp -r mapred-site.xml node2:$PWD
scp –r mapred-site.xml node3:$PWD
啟動(dòng)jobHistoryServer服務(wù)進(jìn)程
mapred --daemon start historyserver
如果關(guān)閉的話 用下述命令
mapred --daemon stop historyserver
頁(yè)面訪問(wèn)jobhistoryserver
http://node1:19888/jobhistory
HDFS的垃圾桶機(jī)制
垃圾桶機(jī)制解析
每一個(gè)文件系統(tǒng)都會(huì)有垃圾桶機(jī)制,便于將刪除的數(shù)據(jù)回收到垃圾桶里面去,避免某些誤操作刪除一些重要文件。回收到垃圾桶里里面的資料數(shù)據(jù),都可以進(jìn)行恢復(fù)。
垃圾桶機(jī)制配置
HDFS的垃圾回收的默認(rèn)配置屬性為 0,也就是說(shuō),如果你不小心誤刪除了某樣?xùn)|西,那么這個(gè)操作是不可恢復(fù)的。
修改core-site.xml :
那么可以按照生產(chǎn)上的需求設(shè)置回收站的保存時(shí)間,這個(gè)時(shí)間以分鐘為單位,例如1440=24h=1天。
然后重啟hdfs集群
垃圾桶機(jī)制驗(yàn)證
如果啟用垃圾箱配置,dfs命令刪除的文件不會(huì)立即從HDFS中刪除。相反,HDFS將其移動(dòng)到垃圾目錄(每個(gè)用戶在/user/<username>/.Trash下都有自己的垃圾目錄)。只要文件保留在垃圾箱中,文件可以快速恢復(fù)。
使用skipTrash選項(xiàng)刪除文件,該選項(xiàng)不會(huì)將文件發(fā)送到垃圾箱。它將從HDFS中完全刪除。