Hadoop是一個十分流行的分布式存儲和計算框架,也是業(yè)內(nèi)大數(shù)據(jù)處理和分析最通用的框架之一。

hadoop_icon.png
Hadoop2.0 由HDFS(Hadoop Distributed File System)、MapReduce和Yarn三部分組成。
Hadoop的設(shè)計原型來源于google的三篇論文,即GFS、MapReduce和BigTable,同時作為Lucene的子項目Nutch的一部分在2005年引入Apache,Hadoop的得名是Hadoop之父Doug Cutting兒子的玩具,值得一提的是他的妻子叫Lucene。
Hadoop生態(tài)

hbase生態(tài).png
"永遠不把雞蛋放在一個籃子里"——HDFS
在分布式的文件系統(tǒng)之前,往往使用大型機和存儲服務(wù)器去做存儲,無論大型機和存儲服務(wù)器都是十分昂貴的,同時也是有瓶頸的,橫向擴展能力很差。而分布式文件系統(tǒng)的橫向擴展能力以及容錯性十分好,也越來越受到人們的青睞。HDFS的定位是用比較廉價的機器,做高可用的海量數(shù)據(jù)的存儲。主要采用多副本的分塊存儲機制,在部分機器宕機或數(shù)據(jù)損壞的情況下,依然能提供可靠服務(wù)。
集群拓撲

hdfs.jpg
NameNode:文件元數(shù)據(jù)存儲節(jié)點,Hadoop1中存在單點問題,Hadoop2中通過備用節(jié)點實現(xiàn)高可用,同時有元數(shù)據(jù)存儲瓶頸,不適于存儲小文件。
DataNode:數(shù)據(jù)節(jié)點,單文件被分成多塊,每一塊多副本跨機架、機房存儲,保證數(shù)據(jù)的高可用。
Block:文件的存儲單位,單個文件可被分成多塊,默認為128M。同時也是MapReduce默認的輸入塊大小。文件讀取流程:

hdfsread.png
open DistributedFileSystem 去NameNode獲取文件的塊列表,NameNode根據(jù)Client距離各節(jié)點的網(wǎng)絡(luò)距離給出Block列表。
根據(jù)Block列表去一次讀取文件,讀取后在Client進行文件匯總。
寫入流程:

hdfs_write.png
實例化DistributeFileSystem,在NameNode進行寫文件的申請,申請成功后創(chuàng)建元數(shù)據(jù),并返回數(shù)據(jù)存放的位置信息。
過位置信息,對DataNode進行流式寫入,將數(shù)據(jù)分成多個數(shù)據(jù)包,作為一個數(shù)據(jù)隊列。寫入時每次取一個數(shù)據(jù)包,寫入全部副本,且三個節(jié)點均寫入成功,則返回ACK信號表名當前buff寫入成功,Client內(nèi)部維護著數(shù)據(jù)包的Ack隊列,收到Ack之后會移除這個數(shù)據(jù)包。
最后想NameNode發(fā)送Complete信號,確認文件寫入全部成功。如果中途節(jié)點寫失?。簩懭氩糠謹?shù)據(jù)的節(jié)點將在管線中移除,同時后續(xù)恢復正常后會刪除這部分數(shù)據(jù)。隨后寫入后續(xù)兩個節(jié)點,原則上寫入一個塊的時候就可以寫成功,因為namenode發(fā)現(xiàn)數(shù)據(jù)不一致會做復制操作。
"分而治之"——MapReduce
分布式計算出現(xiàn)之前,數(shù)據(jù)的計算往往依靠性能比較好的單機計算。但是單機受限于本身的計算資源,往往計算速度都不如人意。
一天小明接到產(chǎn)品的一個需求:
產(chǎn)品:小明啊,這里有一天的日志信息,大概5個G,我要統(tǒng)計一下一共有多少。
小明:OK啊,就5個G,一個shell搞定,看我 cat * | wc -l,我簡直就是個天才。
產(chǎn)品:對不起啊小明,需求變了,一天的看不出來效果,我需要統(tǒng)計1個月的數(shù)據(jù),大概有150G。
小明:有點大啊,不怕,我線上服務(wù)器內(nèi)存120G,40核,看我用多線程搞定,過了2個小時,終于搞 定了還有點費勁。
產(chǎn)品:我保證這是我最后一次變更需求,我想要最近一年的數(shù)據(jù)1800G左右。
小明:數(shù)據(jù)上T了,搞不定了啊。
上面的例子告訴我們,在大數(shù)量的場景下,高性能的單機有時也是解決不了問題。所以我們就需要MapReduce幫助我們。
MapReduce是一種采用分治和規(guī)約的一種并行的批處理框架,先將數(shù)據(jù)做分割計算,最后匯總結(jié)果。看上去和多線程的處理機制一樣,但是Hadoop將它封裝在了框架中,編程十分簡單,吞吐量十分高,目前支持Java、C++、Python等多種API編程。