Hadoop教程:Hadoop核心架構(gòu)詳細解析
通過對Hadoop分布式計算平臺最核心的分布式文件系統(tǒng)HDFS、MapReduce處理過程,以及數(shù)據(jù)倉庫工具Hive和分布式數(shù)據(jù)庫Hbase的介紹,基本涵蓋了Hadoop分布式平臺的所有技術(shù)核心。
通過這一階段的調(diào)研總結(jié),從內(nèi)部機理的角度詳細分析,HDFS、MapReduce、Hbase、Hive是如何運行,以及基于Hadoop數(shù)據(jù)倉庫的構(gòu)建和分布式數(shù)據(jù)庫內(nèi)部具體實現(xiàn)。如有不足,后續(xù)及時修改。
HDFS的體系架構(gòu)
整個Hadoop的體系結(jié)構(gòu)主要是通過HDFS來實現(xiàn)對分布式存儲的底層支持,并通過MR來實現(xiàn)對分布式并行任務(wù)處理的程序支持。
HDFS采用主從(Master/Slave)結(jié)構(gòu)模型,一個HDFS集群是由一個NameNode和若干個DataNode組成的(在最新的Hadoop2.2版本已經(jīng)實現(xiàn)多個NameNode的配置-這也是一些大公司通過修改Hadoop源代碼實現(xiàn)的功能,在最新的版本中就已經(jīng)實現(xiàn)了)。NameNode作為主服務(wù)器,管理文件系統(tǒng)命名空間和客戶端對文件的訪問操作。DataNode管理存儲的數(shù)據(jù)。HDFS支持文件形式的數(shù)據(jù)。
從內(nèi)部來看,文件被分成若干個數(shù)據(jù)塊,這若干個數(shù)據(jù)塊存放在一組DataNode上。NameNode執(zhí)行文件系統(tǒng)的命名空間,如打開、關(guān)閉、重命名文件或目錄等,也負責(zé)數(shù)據(jù)塊到具體DataNode的映射。DataNode負責(zé)處理文件系統(tǒng)客戶端的文件讀寫,并在NameNode的統(tǒng)一調(diào)度下進行數(shù)據(jù)庫的創(chuàng)建、刪除和復(fù)制工作。NameNode是所有HDFS元數(shù)據(jù)的管理者,用戶數(shù)據(jù)永遠不會經(jīng)過NameNode。
如圖:HDFS體系結(jié)構(gòu)圖
圖中涉及三個角色:NameNode、DataNode、Client。NameNode是管理者,DataNode是文件存儲者、Client是需要獲取分布式文件系統(tǒng)的應(yīng)用程序。
文件寫入:
1) Client向NameNode發(fā)起文件寫入的請求。
2) NameNode根據(jù)文件大小和文件塊配置情況,返回給Client它管理的DataNode的信息。
3) Client將文件劃分為多個block,根據(jù)DataNode的地址,按順序?qū)lock寫入DataNode塊中。
文件讀?。?/p>
1) Client向NameNode發(fā)起讀取文件的請求。
2) NameNode返回文件存儲的DataNode信息。
3) Client讀取文件信息。
HDFS作為分布式文件系統(tǒng)在數(shù)據(jù)管理方面可借鑒點:
文件塊的放置:一個Block會有三份備份,一份在NameNode指定的DateNode上,一份放在與指定的DataNode不在同一臺機器的DataNode上,一根在于指定的DataNode在同一Rack上的DataNode上。備份的目的是為了數(shù)據(jù)安全,采用這種方式是為了考慮到同一Rack失敗的情況,以及不同數(shù)據(jù)拷貝帶來的性能的問題。
MapReduce體系架構(gòu)
MR框架是由一個單獨運行在主節(jié)點上的JobTracker和運行在每個集群從節(jié)點上的TaskTracker共同組成。主節(jié)點負責(zé)調(diào)度構(gòu)成一個作業(yè)的所有任務(wù),這些任務(wù)分布在不同的不同的從節(jié)點上。主節(jié)點監(jiān)視它們的執(zhí)行情況,并重新執(zhí)行之前失敗的任務(wù)。從節(jié)點僅負責(zé)由主節(jié)點指派的任務(wù)。當(dāng)一個Job被提交時,JobTracker接受到提交作業(yè)和配置信息之后,就會將配置信息等分發(fā)給從節(jié)點,同時調(diào)度任務(wù)并監(jiān)控TaskTracker的執(zhí)行。JobTracker可以運行于集群中的任意一臺計算機上。TaskTracker負責(zé)執(zhí)行任務(wù),它必須運行在DataNode上,DataNode既是數(shù)據(jù)存儲節(jié)點,也是計算節(jié)點。JobTracker將map任務(wù)和reduce任務(wù)分發(fā)給空閑的TaskTracker,這些任務(wù)并行運行,并監(jiān)控任務(wù)運行的情況。如果JobTracker出了故障,JobTracker會把任務(wù)轉(zhuǎn)交給另一個空閑的TaskTracker重新運行。
HDFS和MR共同組成Hadoop分布式系統(tǒng)體系結(jié)構(gòu)的核心。HDFS在集群上實現(xiàn)了分布式文件系統(tǒng),MR在集群上實現(xiàn)了分布式計算和任務(wù)處理。HDFS在MR任務(wù)處理過程中提供了文件操作和存儲等支持,MR在HDFS的基礎(chǔ)上實現(xiàn)了任務(wù)的分發(fā)、跟蹤、執(zhí)行等工作,并收集結(jié)果,二者相互作用,完成分布式集群的主要任務(wù)。
Hadoop上的并行應(yīng)用程序開發(fā)是基于MR編程框架。MR編程模型原理:利用一個輸入的key-value對集合來產(chǎn)生一個輸出的key-value對集合。MR庫通過Map和Reduce兩個函數(shù)來實現(xiàn)這個框架。用戶自定義的map函數(shù)接受一個輸入的key-value對,然后產(chǎn)生一個中間的key-value對的集合。MR把所有具有相同的key值的value結(jié)合在一起,然后傳遞個reduce函數(shù)。Reduce函數(shù)接受key和相關(guān)的value結(jié)合,reduce函數(shù)合并這些value值,形成一個較小的value集合。通常我們通過一個迭代器把中間的value值提供給reduce函數(shù)(迭代器的作用就是收集這些value值),這樣就可以處理無法全部放在內(nèi)存中的大量的value值集合了。
說明:(第三幅圖為同伴自己畫的)
流程簡而言之,大數(shù)據(jù)集被分成眾多小的數(shù)據(jù)集塊,若干個數(shù)據(jù)集被分在集群中的一個節(jié)點進行處理并產(chǎn)生中間結(jié)果。單節(jié)點上的任務(wù),map函數(shù)一行行讀取數(shù)據(jù)獲得數(shù)據(jù)的(k1,v1),數(shù)據(jù)進入緩存,通過map函數(shù)執(zhí)行map(基于key-value)排序(框架會對map的輸出進行排序)執(zhí)行后輸入(k2,v2)。每一臺機器都執(zhí)行同樣的操作。不同機器上的(k2,v2)通過merge排序的過程(shuffle的過程可以理解成reduce前的一個過程),最后reduce合并得到,(k3,v3),輸出到HDFS文件中。
談到reduce,在reduce之前,可以先對中間數(shù)據(jù)進行數(shù)據(jù)合并(Combine),即將中間有相同的key的對合并。Combine的過程與reduce的過程類似,但Combine是作為map任務(wù)的一部分,在執(zhí)行完map函數(shù)后僅接著執(zhí)行。Combine能減少中間結(jié)果key-value對的數(shù)目,從而降低網(wǎng)絡(luò)流量。
Map任務(wù)的中間結(jié)果在做完Combine和Partition后,以文件的形式存于本地磁盤上。中間結(jié)果文件的位置會通知主控JobTracker,JobTracker再通知reduce任務(wù)到哪一個DataNode上去取中間結(jié)果。所有的map任務(wù)產(chǎn)生的中間結(jié)果均按其key值按hash函數(shù)劃分成R份,R個reduce任務(wù)各自負責(zé)一段key區(qū)間。每個reduce需要向許多個map任務(wù)節(jié)點取的落在其負責(zé)的key區(qū)間內(nèi)的中間結(jié)果,然后執(zhí)行reduce函數(shù),最后形成一個最終結(jié)果。有R個reduce任務(wù),就會有R個最終結(jié)果,很多情況下這R個最終結(jié)果并不需要合并成一個最終結(jié)果,因為這R個最終結(jié)果可以作為另一個計算任務(wù)的輸入,開始另一個并行計算任務(wù)。這就形成了上面圖中多個輸出數(shù)據(jù)片段(HDFS副本)。
Hbase數(shù)據(jù)管理
Hbase就是Hadoop database。與傳統(tǒng)的mysql、oracle究竟有什么差別。即列式數(shù)據(jù)與行式數(shù)據(jù)由什么區(qū)別。NoSql數(shù)據(jù)庫與傳統(tǒng)關(guān)系型數(shù)據(jù)由什么區(qū)別:
Hbase VS Oracle
1、 Hbase適合大量插入同時又有讀的情況。輸入一個Key獲取一個value或輸入一些key獲得一些value。
2、 Hbase的瓶頸是硬盤傳輸速度。Hbase的操作,它可以往數(shù)據(jù)里面insert,也可以update一些數(shù)據(jù),但update的實際上也是insert,只是插入一個新的時間戳的一行。Delete數(shù)據(jù),也是insert,只是insert一行帶有delete標(biāo)記的一行。Hbase的所有操作都是追加插入操作。Hbase是一種日志集數(shù)據(jù)庫。它的存儲方式,像是日志文件一樣。它是批量大量的往硬盤中寫,通常都是以文件形式的讀寫。這個讀寫速度,就取決于硬盤與機器之間的傳輸有多快。而Oracle的瓶頸是硬盤尋道時間。它經(jīng)常的操作時隨機讀寫。要update一個數(shù)據(jù),先要在硬盤中找到這個block,然后把它讀入內(nèi)存,在內(nèi)存中的緩存中修改,過段時間再回寫回去。由于你尋找的block不同,這就存在一個隨機的讀。硬盤的尋道時間主要由轉(zhuǎn)速來決定的。而尋道時間,技術(shù)基本沒有改變,這就形成了尋道時間瓶頸。
3、 Hbase中數(shù)據(jù)可以保存許多不同時間戳的版本(即同一數(shù)據(jù)可以復(fù)制許多不同的版本,準(zhǔn)許數(shù)據(jù)冗余,也是優(yōu)勢)。數(shù)據(jù)按時間排序,因此Hbase特別適合尋找按照時間排序?qū)ふ襎op n的場景。找出某個人最近瀏覽的消息,最近寫的N篇博客,N種行為等等,因此Hbase在互聯(lián)網(wǎng)應(yīng)用非常多。
4、 Hbase的局限。只能做很簡單的Key-value查詢。它適合有高速插入,同時又有大量讀的操作場景。而這種場景又很極端,并不是每一個公司都有這種需求。在一些公司,就是普通的OLTP(聯(lián)機事務(wù)處理)隨機讀寫。在這種情況下,Oracle的可靠性,系統(tǒng)的負責(zé)程度又比Hbase低一些。而且Hbase局限還在于它只有主鍵索引,因此在建模的時候就遇到了問題。比如,在一張表中,很多的列我都想做某種條件的查詢。但卻只能在主鍵上建快速查詢。所以說,不能籠統(tǒng)的說那種技術(shù)有優(yōu)勢。
5、 Oracle是行式數(shù)據(jù)庫,而Hbase是列式數(shù)據(jù)庫。列式數(shù)據(jù)庫的優(yōu)勢在于數(shù)據(jù)分析這種場景。數(shù)據(jù)分析與傳統(tǒng)的OLTP的區(qū)別。數(shù)據(jù)分析,經(jīng)常是以某個列作為查詢條件,返回的結(jié)果也經(jīng)常是某一些列,不是全部的列。在這種情況下,行式數(shù)據(jù)庫反應(yīng)的性能就很低效。
行式數(shù)據(jù)庫:Oracle為例,數(shù)據(jù)文件的基本組成單位:塊/頁。塊中數(shù)據(jù)是按照一行行寫入的。這就存在一個問題,當(dāng)我們要讀一個塊中的某些列的時候,不能只讀這些列,必須把這個塊整個的讀入內(nèi)存中,再把這些列的內(nèi)容讀出來。換句話就是:為了讀表中的某些列,必須要把整個表的行全部讀完,才能讀到這些列。這就是行數(shù)據(jù)庫最糟糕的地方。
列式數(shù)據(jù)庫:是以列作為元素存儲的。同一個列的元素會擠在一個塊。當(dāng)要讀某些列,只需要把相關(guān)的列塊讀到內(nèi)存中,這樣讀的IO量就會少很多。通常,同一個列的數(shù)據(jù)元素通常格式都是相近的。這就意味著,當(dāng)數(shù)據(jù)格式相近的時候,數(shù)據(jù)就可以做大幅度的壓縮。所以,列式數(shù)據(jù)庫在數(shù)據(jù)壓縮方面有很大的優(yōu)勢,壓縮不僅節(jié)省了存儲空間,同時也節(jié)省了IO。(這一點,可利用在當(dāng)數(shù)據(jù)達到百萬、千萬級別以后,數(shù)據(jù)查詢之間的優(yōu)化,提高性能,示場景而定)
Hive數(shù)據(jù)管理
Hive是建立在Hadoop上的數(shù)據(jù)倉庫基礎(chǔ)架構(gòu)。它提供了一系列的工具,用來進行數(shù)據(jù)提取、轉(zhuǎn)換、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)機制??梢园袶adoop下結(jié)構(gòu)化數(shù)據(jù)文件映射為一張成Hive中的表,并提供類sql查詢功能,除了不支持更新、索引和事務(wù),sql其它功能都支持??梢詫ql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行,作為sql到MapReduce的映射器。提供shell、JDBC/ODBC、Thrift、Web等接口。優(yōu)點:成本低可以通過類sql語句快速實現(xiàn)簡單的MapReduce統(tǒng)計。作為一個數(shù)據(jù)倉庫,Hive的數(shù)據(jù)管理按照使用層次可以從元數(shù)據(jù)存儲、數(shù)據(jù)存儲和數(shù)據(jù)交換三個方面介紹。
(1)元數(shù)據(jù)存儲
Hive將元數(shù)據(jù)存儲在RDBMS中,有三種方式可以連接到數(shù)據(jù)庫:
·內(nèi)嵌模式:元數(shù)據(jù)保持在內(nèi)嵌數(shù)據(jù)庫的Derby,一般用于單元測試,只允許一個會話連接
·多用戶模式:在本地安裝Mysql,把元數(shù)據(jù)放到Mysql內(nèi)
·遠程模式:元數(shù)據(jù)放置在遠程的Mysql數(shù)據(jù)庫
(2)數(shù)據(jù)存儲
首先,Hive沒有專門的數(shù)據(jù)存儲格式,也沒有為數(shù)據(jù)建立索引,用于可以非常自由的組織Hive中的表,只需要在創(chuàng)建表的時候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,這就可以解析數(shù)據(jù)了。
其次,Hive中所有的數(shù)據(jù)都存儲在HDFS中,Hive中包含4中數(shù)據(jù)模型:Tabel、ExternalTable、Partition、Bucket。
Table:類似與傳統(tǒng)數(shù)據(jù)庫中的Table,每一個Table在Hive中都有一個相應(yīng)的目錄來存儲數(shù)據(jù)。例如:一個表zz,它在HDFS中的路徑為:/wh/zz,其中wh是在hive-site.xml中由$指定的數(shù)據(jù)倉庫的目錄,所有的Table數(shù)據(jù)(不含External Table)都保存在這個目錄中。
Partition:類似于傳統(tǒng)數(shù)據(jù)庫中劃分列的索引。在Hive中,表中的一個Partition對應(yīng)于表下的一個目錄,所有的Partition數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如:zz表中包含ds和city兩個Partition,則對應(yīng)于ds=20140214,city=beijing的HDFS子目錄為:/wh/zz/ds=20140214/city=Beijing;
Buckets:對指定列計算的hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了便于并行,每一個Buckets對應(yīng)一個文件。將user列分?jǐn)?shù)至32個Bucket上,首先對user列的值計算hash,比如,對應(yīng)hash=0的HDFS目錄為:/wh/zz/ds=20140214/city=Beijing/part-00000;對應(yīng)hash=20的,目錄為:/wh/zz/ds=20140214/city=Beijing/part-00020。
ExternalTable指向已存在HDFS中的數(shù)據(jù),可創(chuàng)建Partition。和Table在元數(shù)據(jù)組織結(jié)構(gòu)相同,在實際存儲上有較大差異。Table創(chuàng)建和數(shù)據(jù)加載過程,可以用統(tǒng)一語句實現(xiàn),實際數(shù)據(jù)被轉(zhuǎn)移到數(shù)據(jù)倉庫目錄中,之后對數(shù)據(jù)的訪問將會直接在數(shù)據(jù)倉庫的目錄中完成。刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)都會刪除。ExternalTable只有一個過程,因為加載數(shù)據(jù)和創(chuàng)建表是同時完成。世界數(shù)據(jù)是存儲在Location后面指定的HDFS路徑中的,并不會移動到數(shù)據(jù)倉庫中。
(3)數(shù)據(jù)交換
·用戶接口:包括客戶端、Web界面和數(shù)據(jù)庫接口
·元數(shù)據(jù)存儲:通常是存儲在關(guān)系數(shù)據(jù)庫中的,如Mysql,Derby等
·Hadoop:用HDFS進行存儲,利用MapReduce進行計算。
關(guān)鍵點:Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中,如Mysql、Derby中。Hive中的元數(shù)據(jù)包括表的名字、表的列和分區(qū)及其屬性、表的屬性(是否為外部表)、表數(shù)據(jù)所在的目錄等。
Hive的數(shù)據(jù)存儲在HDFS中,大部分的查詢由MapReduce完成。
總結(jié):
通過對Hadoop分布式計算平臺最核心的分布式文件系統(tǒng)HDFS、MapReduce處理過程,以及數(shù)據(jù)倉庫工具Hive和分布式數(shù)據(jù)庫Hbase的介紹?;竞w了Hadoop分布式平臺的所有技術(shù)核心。從體系架構(gòu)到數(shù)據(jù)定義到數(shù)據(jù)存儲再到數(shù)據(jù)處理,從宏觀到微觀的系統(tǒng)介紹,為Hadoop平臺上大規(guī)模的數(shù)據(jù)存儲和任務(wù)處理打下基礎(chǔ)
本文來自中國統(tǒng)計網(wǎng)