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