一敌呈、Hadoop概述
Hadoop是Google的集群系統(tǒng)開源實(shí)現(xiàn)
Google的集群系統(tǒng):GFS、MapReduce、BigTable
Hadoop的集群系統(tǒng):HDFS称鳞、MapReduce苍糠、HBase
Hadoop設(shè)計(jì)的初衷是為了解決Nutch的海量數(shù)據(jù)存儲(chǔ)和處理的需求叁丧,可以解決大數(shù)據(jù)場景下的數(shù)據(jù)存儲(chǔ)和處理的問題。
傳統(tǒng)數(shù)據(jù):GB岳瞭、TB級別的數(shù)據(jù)拥娄、數(shù)據(jù)增長不快、主要為結(jié)構(gòu)化的數(shù)據(jù)瞳筏、統(tǒng)計(jì)和報(bào)表
大數(shù)據(jù):TB稚瘾、PB級別的數(shù)據(jù)、持續(xù)的高速增長姚炕、半結(jié)構(gòu)化摊欠、非結(jié)構(gòu)化的數(shù)據(jù)、數(shù)據(jù)挖掘和預(yù)測性分析钻心、海量數(shù)據(jù)的獲取凄硼、存儲(chǔ)、聚合捷沸、管理這些數(shù)據(jù)以及對數(shù)據(jù)進(jìn)行深度分析的新技術(shù)和新能力摊沉。
**名字的起源: Doug Cutting如此解釋Hadoop的得名:"這個(gè)名字是我孩子給一頭吃飽了的棕黃色大象命名的。我的命名標(biāo)準(zhǔn)就是簡短痒给,容易發(fā)音和拼寫说墨,沒有太多的意義,并且不會(huì)被用于別處苍柏。小孩子是這方面的高手尼斧。Googol就是由小孩命名的。"
組成:HDFS MapReduce Yarn
二试吁、Hadoop版本 下載安裝
1.下載
下載地址:http://hadoop.apache.org/releases.html
**Apache Hadoop版本分為兩代棺棵,我們將第一代Hadoop稱為Hadoop 1.0楼咳,第二代Hadoop稱為Hadoop 2.0。第一代Hadoop包含三個(gè)大版本烛恤,分別是0.20.x母怜,0.21.x和0.22.x,其中缚柏,0.20.x最后演化成1.0.x苹熏,變成了穩(wěn)定版,而0.21.x和0.22.x則NameNode HA等新的重大特性币喧。第二代Hadoop包含兩個(gè)版本轨域,分別是0.23.x和2.x,它們完全不同于Hadoop 1.0杀餐,是一套全新的架構(gòu)干发,均包含HDFS Federation和YARN兩個(gè)系統(tǒng),相比于0.23.x怜浅,2.x增加了NameNode HA和Wire-compatibility兩個(gè)重大特性
2.安裝
Hadoop的安裝分為單機(jī)方式铐然、偽分布式方式 和 完全分布式方式蔬崩。
單機(jī)模式是Hadoop的默認(rèn)模式恶座。當(dāng)首次解壓Hadoop的源碼包時(shí),Hadoop無法了解硬件安裝環(huán)境沥阳,便保守地選擇了最小配置跨琳。在這種默認(rèn)模式下所有3個(gè)XML文件均為空。當(dāng)配置文件為空時(shí)桐罕,Hadoop會(huì)完全運(yùn)行在本地脉让。因?yàn)椴恍枰c其他節(jié)點(diǎn)交互,單機(jī)模式就不使用HDFS功炮,也不加載任何Hadoop的守護(hù)進(jìn)程溅潜。該模式主要用于開發(fā)調(diào)試MapReduce程序的應(yīng)用邏輯。
偽分布模式:Hadoop守護(hù)進(jìn)程運(yùn)行在本地機(jī)器上薪伏,模擬一個(gè)小規(guī)模的的集群滚澜。可以使用HDFS和MapReduce
全分布模式:Hadoop守護(hù)進(jìn)程運(yùn)行在一個(gè)集群上
二嫁怀、HDFS的特點(diǎn)
1.HDFS概述(HDFS架構(gòu)圖):
HDFS為了保證數(shù)據(jù)存儲(chǔ)的可靠性和讀取性能设捐,對數(shù)據(jù)進(jìn)行切塊后進(jìn)行復(fù)制并存儲(chǔ)在集群的多個(gè)節(jié)點(diǎn)中。
HDFS中存在一個(gè)名字節(jié)點(diǎn)NameNode和多個(gè)數(shù)據(jù)節(jié)點(diǎn)DataNode
NameNode:存儲(chǔ)元數(shù)據(jù)信息塘淑、元數(shù)據(jù)保存在內(nèi)存/磁盤中萝招、保存文件、block存捺、datanode之間的映射關(guān)系
DataNode:存儲(chǔ)block內(nèi)容槐沼、存儲(chǔ)在磁盤中、維護(hù)了block id到文件的映射關(guān)系
2.HDFS優(yōu)點(diǎn)
支持超大文件:
支持超大文件。超大文件在這里指的是幾百M(fèi)岗钩,幾百GB逸爵,甚至幾TB大小的文件。一般來說hadoop的文件系統(tǒng)會(huì)存儲(chǔ)TB級別或者PB級別的數(shù)據(jù)凹嘲。所以在企業(yè)的應(yīng)用中师倔,數(shù)據(jù)節(jié)點(diǎn)有可能有上千個(gè)。
檢測和快速應(yīng)對硬件故障:
在集群的環(huán)境中周蹭,硬件故障是常見的問題趋艘。因?yàn)橛猩锨_(tái)服務(wù)器連接在一起,這樣會(huì)導(dǎo)致高故障率凶朗。因此故障檢測和自動(dòng)恢復(fù)是hdfs文件系統(tǒng)的一個(gè)設(shè)計(jì)目標(biāo)瓷胧。
流式數(shù)據(jù)訪問:
Hdfs的數(shù)據(jù)處理規(guī)模比較大,應(yīng)用一次需要訪問大量的數(shù)據(jù)棚愤,同時(shí)這些應(yīng)用一般都是批量處理搓萧,而不是用戶交互式處理。應(yīng)用程序能以流的形式訪問數(shù)據(jù)集宛畦。主要的是數(shù)據(jù)的吞吐量瘸洛,而不是訪問速度。
簡化的一致性模型:
大部分hdfs操作文件時(shí)次和,需要一次寫入反肋,多次讀取。在hdfs中踏施,一個(gè)文件一旦經(jīng)過創(chuàng)建石蔗、寫入、關(guān)閉后畅形,一般就不需要修改了养距。這樣簡單的一致性模型,有利于提高吞吐量日熬。
高容錯(cuò)性:
數(shù)據(jù)自動(dòng)保存多個(gè)副本棍厌,副本丟失后自動(dòng)恢復(fù)
可構(gòu)建在廉價(jià)機(jī)器上:
構(gòu)建在廉價(jià)機(jī)器上可以輕松的通過擴(kuò)展機(jī)器數(shù)量來近乎線性的提高集群存儲(chǔ)能力
3.HDFS缺點(diǎn)
低延遲數(shù)據(jù)訪問:
低延遲數(shù)據(jù)。如和用戶進(jìn)行交互的應(yīng)用碍遍,需要數(shù)據(jù)在毫秒或秒的范圍內(nèi)得到響應(yīng)定铜。由于hadoop針對高數(shù)據(jù)吞吐量做了優(yōu)化,犧牲了獲取數(shù)據(jù)的延遲怕敬,所以對于低延遲來說揣炕,不適合用hadoop來做。
大量的小文件:
Hdfs支持超大的文件东跪,是通過數(shù)據(jù)分布在數(shù)據(jù)節(jié)點(diǎn)畸陡,數(shù)據(jù)的元數(shù)據(jù)保存在名字節(jié)點(diǎn)上鹰溜。名字節(jié)點(diǎn)的內(nèi)存大小,決定了hdfs文件系統(tǒng)可保存的文件數(shù)量丁恭。雖然現(xiàn)在的系統(tǒng)內(nèi)存都比較大曹动,但大量的小文件還是會(huì)影響名字節(jié)點(diǎn)的性能。
多用戶寫入文件牲览、修改文件:
Hdfs的文件只能有一次寫入墓陈,不支持修改和追加寫入(2.0版本支持追加),也不支持修改第献。只有這樣數(shù)據(jù)的吞吐量才能大贡必。
三、HDFS技術(shù)細(xì)節(jié)
1.Block
最基本的存儲(chǔ)單位庸毫。
在HDFS中仔拟,有一個(gè)特別重要的概念:數(shù)據(jù)塊(Block)。前面介紹到飒赃,在HDFS中存儲(chǔ)的文件都是超大數(shù)據(jù)的文件利花,我們可以把這個(gè)超大規(guī)模的文件以一個(gè)標(biāo)準(zhǔn)切分成幾塊,分別存儲(chǔ)到不同的磁盤上载佳。這個(gè)標(biāo)準(zhǔn)就稱為Block炒事。Block 默認(rèn)的大小為64(128)M。這樣做有以下幾點(diǎn)好處:
1.文件塊可以保存在不同的磁盤上刚盈。在HDFS系統(tǒng)中羡洛,一個(gè)文件可以分成不同的Block存儲(chǔ)在不同的磁盤上挂脑。
2.簡化存儲(chǔ)系統(tǒng)藕漱。這樣不需要管理文件,而是管理文件塊就可以了崭闲。
3.有利于數(shù)據(jù)的復(fù)制肋联。在HDFS系統(tǒng)中,一個(gè)block一般會(huì)復(fù)制3份
4.對于文件內(nèi)容而言刁俭,一個(gè)文件的長度大小是size橄仍,那么從文件的0偏移開始,按照固定的大小牍戚,順序?qū)ξ募M(jìn)行劃分并編號(hào)侮繁,劃分好的每一個(gè)塊稱一個(gè)Block。HDFS默認(rèn)Block大小是128MB如孝,以一個(gè)256MB文件,共有256/128=2個(gè)Block.
5.不同于普通文件系統(tǒng)的是,HDFS中跋选,如果一個(gè)文件小于一個(gè)數(shù)據(jù)塊的大小裸卫,并不占用整個(gè)數(shù)據(jù)塊存儲(chǔ)空間
2.NameNode
NameNode維護(hù)著HDFS中的元信息彬祖,包括文件和Block之間關(guān)系的信息、Block數(shù)量信息品抽、Block和DataNode之間的關(guān)系信息储笑,數(shù)據(jù)格式參照如下:
FileName replicas block-Ids id2host
例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
NameNode中的元數(shù)據(jù)信息存儲(chǔ)在內(nèi)存/文件中,內(nèi)存中為實(shí)時(shí)信息圆恤,文件中為數(shù)據(jù)鏡像作為持久化存儲(chǔ)使用突倍。
文件包括:
fsimage 元數(shù)據(jù)鏡像文件。存儲(chǔ)某NameNode元數(shù)據(jù)信息盆昙,并不是實(shí)時(shí)同步內(nèi)存中的數(shù)據(jù)赘方。
edits 操作日志文件
fstime 保存最近一次checkpoit的時(shí)間
當(dāng)有寫請求時(shí),NameNode會(huì)首先寫editlog到磁盤edits文件中弱左,成功后才會(huì)修改內(nèi)存窄陡,并向客戶端返回
所以,fsimage中的數(shù)據(jù)并不是實(shí)時(shí)的數(shù)據(jù)拆火,而是在達(dá)到條件時(shí)再進(jìn)行更新跳夭,更新過程需要SNN參與
NameNode的metadata信息會(huì)在啟動(dòng)后加載到內(nèi)存中
3.SecondaryNameNode
SecondaryNameNode并不是NameNode的熱備份,而是協(xié)助者幫助NameNode進(jìn)行元數(shù)據(jù)的合并们镜,從另外的角度來看可以提供一定的備份功能币叹,但并不是熱備,這種合并過程可能會(huì)造成極端情況下數(shù)據(jù)丟失模狭!可以從ssn中恢復(fù)部分?jǐn)?shù)據(jù)颈抚,但是無法恢復(fù)全部。
何時(shí)出發(fā)數(shù)據(jù)合并嚼鹉?:
根據(jù)配置文件設(shè)置的時(shí)間間隔:fs.checkpoint.period 默認(rèn)3600秒
根據(jù)配置文件設(shè)置的edits log大小 fs.checkpoint.size 默認(rèn)64MB
合并過程:
達(dá)到條件后 snn會(huì)將nn中的fsimage和edits文件拷貝過來贩汉,同時(shí)nn中會(huì)創(chuàng)建一個(gè)新的edits.new文件,新的讀寫請求會(huì)寫入到這個(gè)edits.new中锚赤,在snn中將拷貝過來的fsimage和edits合并為一個(gè)新的fsimage匹舞,最后snn將合并完成的fsimage文件拷貝回nn中替換之前的fsimage,nn再將edtis.new改為edits
由于NameNode實(shí)時(shí)數(shù)據(jù)都在內(nèi)存中线脚,此處的合并指的是磁盤中的持久化的數(shù)據(jù)的處理赐稽。
snn并不是nn的熱備,但是能保存大部分備份數(shù)據(jù)浑侥。原因就在于edits.new中的數(shù)據(jù)丟失了就找不回來了
通常NameNode和SNN要放置到不同機(jī)器中以此提升性能姊舵,并提供一定的元數(shù)據(jù)安全性。
ps:hadoop2.0有了HA熱備機(jī)制之后寓落,1.0中的secondarynamenode括丁,checkpointnode,buckcupnode這些都不需要了
4.DataNode
在hadoop中零如,數(shù)據(jù)是存放在DataNode上面的躏将。是以Block的形式存儲(chǔ)的锄弱。
DataNode節(jié)點(diǎn)會(huì)不斷向NameNode節(jié)點(diǎn)發(fā)送心跳報(bào)告。
初始化時(shí)祸憋,每個(gè)數(shù)據(jù)節(jié)點(diǎn)將當(dāng)前存儲(chǔ)的數(shù)據(jù)塊告知NameNode節(jié)點(diǎn)会宪。
通過向NameNode主動(dòng)發(fā)送心跳保持與其聯(lián)系(3秒一次)
后續(xù)DataNode節(jié)點(diǎn)在工作的過程中,數(shù)據(jù)節(jié)點(diǎn)仍會(huì)不斷的更新NameNode節(jié)點(diǎn)與之對應(yīng)的元數(shù)據(jù)信息蚯窥,并接受來自NameNode節(jié)點(diǎn)的指令掸鹅,創(chuàng)建、移動(dòng)或者刪除本地磁盤上的數(shù)據(jù)塊拦赠。
如果10分鐘都沒收到dn的心跳巍沙,則認(rèn)為其已經(jīng)lost,并copy其上的block到其他dn
Replication荷鼠。多復(fù)本句携。默認(rèn)是三個(gè)。
5.Block副本放置策略:
第一個(gè)副本:放置在上傳文件的DN允乐,如果是集群外提交矮嫉,就隨機(jī)選擇一臺(tái)磁盤不太滿,cpu不太忙的節(jié)點(diǎn)
第二個(gè)副本:放置在第一個(gè)副本不同機(jī)架的節(jié)點(diǎn)上
第三個(gè)副本:放置在與第一個(gè)副本相同機(jī)架的節(jié)點(diǎn)上(機(jī)架內(nèi)通訊比機(jī)架間通訊塊)
更多副本:隨機(jī)節(jié)點(diǎn)
**機(jī)架感知策略(參看文章)
四牍疏、HDFS的shell操作
常用命令:
hadoop fs -mkdir /user/trunk
hadoop fs -ls /user
hadoop fs -lsr /user? (遞歸的)
hadoop fs -put test.txt /user/trunk
hadoop fs -put test.txt .? (復(fù)制到hdfs當(dāng)前目錄下蠢笋,首先要?jiǎng)?chuàng)建當(dāng)前目錄)
hadoop fs -get /user/trunk/test.txt . (復(fù)制到本地當(dāng)前目錄下)
hadoop fs -cat /user/trunk/test.txt
hadoop fs -tail /user/trunk/test.txt? (查看最后1000字節(jié))
hadoop fs -rm /user/trunk/test.txt
hadoop fs -rmdir /user/trunk
hadoop fs -help ls (查看ls命令的幫助文檔)
五、HDFS執(zhí)行流程
1.HDFS讀流程
使用HDFS提供的客戶端開發(fā)庫Client鳞陨,向遠(yuǎn)程的Namenode發(fā)起RPC請求昨寞;
Namenode會(huì)視情況返回文件的部分或者全部block列表,對于每個(gè)block厦滤,Namenode都會(huì)返回有該block拷貝的DataNode地址援岩;
客戶端開發(fā)庫Client會(huì)選取離客戶端最接近的DataNode來讀取block;如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù).
讀取完當(dāng)前block的數(shù)據(jù)后馁害,關(guān)閉與當(dāng)前的DataNode連接窄俏,并為讀取下一個(gè)block尋找最佳的DataNode;
當(dāng)讀完列表的block后碘菜,且文件讀取還沒有結(jié)束,客戶端開發(fā)庫會(huì)繼續(xù)向Namenode獲取下一批的block列表限寞。
讀取完一個(gè)block都會(huì)進(jìn)行checksum驗(yàn)證忍啸,如果讀取datanode時(shí)出現(xiàn)錯(cuò)誤,客戶端會(huì)通知Namenode履植,然后再從下一個(gè)擁有該block拷貝的datanode繼續(xù)讀计雌。
當(dāng)文件最后一個(gè)塊也都讀取完成后,datanode會(huì)連接namenode告知關(guān)閉文件玫霎。
2.HDFS的寫流程
使用HDFS提供的客戶端開發(fā)庫Client凿滤,向遠(yuǎn)程的Namenode發(fā)起RPC請求妈橄;
Namenode會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作翁脆,成功則會(huì)為文件創(chuàng)建一個(gè)記錄眷蚓,否則會(huì)讓客戶端拋出異常;
當(dāng)客戶端開始寫入文件的時(shí)候反番,開發(fā)庫會(huì)將文件切分成多個(gè)packets沙热,并在內(nèi)部以數(shù)據(jù)隊(duì)列"data queue"的形式管理這些packets,并向Namenode申請新的blocks罢缸。篙贸,獲取用來存儲(chǔ)replicas的合適的datanodes列表, 列表的大小根據(jù)在Namenode中對replication的設(shè)置而定
開始以pipeline(管道)的形式將packet寫入所 有的replicas中枫疆。開發(fā)庫把packet以流的方式寫入第一個(gè)datanode爵川,該datanode把該packet存儲(chǔ)之后,再將其傳遞給在此 pipeline中的下一個(gè)datanode息楔,直到最后一個(gè)datanode雁芙,這種寫數(shù)據(jù)的方式呈流水線的形式。
最后一個(gè)datanode成功存儲(chǔ)之后會(huì)返回一個(gè)ack packet钞螟,在pipeline里傳遞至客戶端兔甘,在客戶端的開發(fā)庫內(nèi)部維護(hù)著"ack queue",成功收到datanode返回的ack packet后會(huì)從"ack queue"移除相應(yīng)的packet鳞滨。
在讀取的時(shí)候洞焙,如果client與datanode通信時(shí)遇到一個(gè)錯(cuò)誤,那么它就會(huì)去嘗試對這個(gè)塊來說下一個(gè)最近的塊拯啦。它也會(huì)記住那個(gè)故障節(jié)點(diǎn)的datanode澡匪,以保證不會(huì)再對之后的塊進(jìn)行徒勞無益的嘗試。client也會(huì)確認(rèn)datanode發(fā)來的數(shù)據(jù)的校驗(yàn)和褒链。如果發(fā)現(xiàn)一個(gè)損壞的塊唁情,它就會(huì)在client試圖從別的datanode中讀取一個(gè)塊的副本之前報(bào)告給namenode。
這個(gè)設(shè)計(jì)的一個(gè)重點(diǎn)是甫匹,client直接聯(lián)系datanode去檢索數(shù)據(jù)甸鸟,并被namenode指引到塊中最好的datanode。因?yàn)閿?shù)據(jù)流在此集群中是在所有datanode分散進(jìn)行的兵迅。所以這種設(shè)計(jì)能使HDFS可擴(kuò)展到最大的并發(fā)client數(shù)量抢韭。同時(shí),namenode只不過提供塊的位置請求(存儲(chǔ)在內(nèi)存中恍箭,十分高效)刻恭,不是提供數(shù)據(jù)。否則如果客戶端數(shù)量增長扯夭,namenode就會(huì)快速成為一個(gè)“瓶頸”鳍贾。
3.HDFS的刪除流程
先在NameNode上執(zhí)行節(jié)點(diǎn)名字的刪除鞍匾。
當(dāng)NameNode執(zhí)行delete方法時(shí),它只標(biāo)記操作涉及的需要被刪除的數(shù)據(jù)塊骑科,而不會(huì)主動(dòng)聯(lián)系這些數(shù)據(jù)塊所在的DataNode節(jié)點(diǎn)橡淑。
當(dāng)保存著這些數(shù)據(jù)塊的DataNode節(jié)點(diǎn)向NameNode節(jié)點(diǎn)發(fā)送心跳時(shí),在心跳應(yīng)答里纵散,NameNode節(jié)點(diǎn)會(huì)向DataNode發(fā)出指令梳码,從而把數(shù)據(jù)刪除掉。
所以在執(zhí)行完delete方法后的一段時(shí)間內(nèi)伍掀,數(shù)據(jù)塊才能被真正的刪除掉掰茶。
**安全模式
在重新啟動(dòng)HDFS后,會(huì)立即進(jìn)入安全模式蜜笤,此時(shí)不能操作hdfs中的文件濒蒋,只能查看目錄文件名等,讀寫操作都不能進(jìn)行把兔。
namenode啟動(dòng)時(shí)沪伙,需要載入fsimage文件到內(nèi)存,同時(shí)執(zhí)行edits文件中各項(xiàng)操作
一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)的映射县好,則創(chuàng)建一個(gè)新的fsimage文件(這個(gè)步驟不需要SNN的參與)和一個(gè)空的編輯文件围橡。
此時(shí)namenode文件系統(tǒng)對于客戶端來說是只讀的。
再此階段NameNode收集各個(gè)DataNode的報(bào)告缕贡,當(dāng)數(shù)據(jù)塊達(dá)到最小復(fù)本數(shù)以上時(shí)翁授,會(huì)被認(rèn)為是“安全”的,在一定比例的數(shù)據(jù)塊被確定為安全后晾咪,再經(jīng)過若干時(shí)間收擦,安全模式結(jié)束
當(dāng)檢測到副本數(shù)不足的數(shù)據(jù)塊時(shí),該塊會(huì)被復(fù)制直到到達(dá)最小副本數(shù)谍倦,系統(tǒng)中數(shù)據(jù)塊的位置并不是namenode維護(hù)的塞赂,而是以塊列表的形式存儲(chǔ)在datanode中。
當(dāng)啟動(dòng)報(bào)如下錯(cuò)誤時(shí):
org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode
使用如下命令退出安全模式:
hadoop dfsadmin -safemode leave
六昼蛀、 HDFS FileSystem JavaAPI
待補(bǔ)充