大數據掃盲!詳解Hadoop核心架構

通過對Hadoop分佈式計算平臺最核心的分佈式文件系統HDFS、MapReduce處理過程,以及數據倉庫工具Hive和分佈式數據庫Hbase的介紹。基本涵蓋了Hadoop分佈式平臺的所有技術核心。


大數據掃盲!詳解Hadoop核心架構


通過階段性的調研總結,從內部機理的角度詳細分析,HDFS、MapReduce、Hbase、Hive是如何運行,以及基於Hadoop數據倉庫的構建和分佈式數據庫內部具體實現。

HDFS的體系架構

整個Hadoop的體系結構主要是通過HDFS來實現對分佈式存儲的底層支持,並通過MR來實現對分佈式並行任務處理的程序支持。

HDFS採用主從(Master/Slave)結構模型,一個HDFS集群是由一個NameNode和若干個DataNode組成的(在最新的Hadoop2.2版本已經實現多個NameNode的配置-這也是一些大公司通過修改hadoop源代碼實現的功能,在最新的版本中就已經實現了)。NameNode作為主服務器,管理文件系統命名空間和客戶端對文件的訪問操作。DataNode管理存儲的數據。HDFS支持文件形式的數據。

從內部來看,文件被分成若干個數據塊,這若干個數據塊存放在一組DataNode上。NameNode執行文件系統的命名空間,如打開、關閉、重命名文件或目錄等,也負責數據塊到具體DataNode的映射。DataNode負責處理文件系統客戶端的文件讀寫,並在NameNode的統一調度下進行數據庫的創建、刪除和複製工作。NameNode是所有HDFS元數據的管理者,用戶數據永遠不會經過NameNode。


大數據掃盲!詳解Hadoop核心架構


HDFS體系結構圖

圖中涉及三個角色:NameNode、DataNode、Client。NameNode是管理者,DataNode是文件存儲者、Client是需要獲取分佈式文件系統的應用程序。

文件寫入:

1)Client向NameNode發起文件寫入的請求。

2)NameNode根據文件大小和文件塊配置情況,返回給Client它管理的DataNode的信息。

3)Client將文件劃分為多個block,根據DataNode的地址,按順序將block寫入DataNode塊中。

文件讀取:

1)Client向NameNode發起讀取文件的請求。

2)NameNode返回文件存儲的DataNode信息。

3)Client讀取文件信息。

HDFS作為分佈式文件系統在數據管理方面可借鑑點:

文件塊的放置:一個Block會有三份備份,一份在NameNode指定的DateNode上,一份放在與指定的DataNode不在同一臺機器的DataNode上,一根在於指定的DataNode在同一Rack上的DataNode上。備份的目的是為了數據安全,採用這種方式是為了考慮到同一Rack失敗的情況,以及不同數據拷貝帶來的性能的問題。

MapReduce體系架構

MR框架是由一個單獨運行在主節點上的JobTracker和運行在每個集群從節點上的TaskTracker共同組成。主節點負責調度構成一個作業的所有任務,這些任務分佈在不同的不同的從節點上。主節點監視它們的執行情況,並重新執行之前失敗的任務。從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接受到提交作業和配置信息之後,就會將配置信息等分發給從節點,同時調度任務並監控TaskTracker的執行。JobTracker可以運行於集群中的任意一臺計算機上。TaskTracker負責執行任務,它必須運行在DataNode上,DataNode既是數據存儲節點,也是計算節點。JobTracker將map任務和reduce任務分發給空閒的TaskTracker,這些任務並行運行,並監控任務運行的情況。如果JobTracker出了故障,JobTracker會把任務轉交給另一個空閒的TaskTracker重新運行。

HDFS和MR共同組成Hadoop分佈式系統體系結構的核心。HDFS在集群上實現了分佈式文件系統,MR在集群上實現了分佈式計算和任務處理。

HDFS在MR任務處理過程中提供了文件操作和存儲等支持,MR在HDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成分佈式集群的主要任務。

Hadoop上的並行應用程序開發是基於MR編程框架。MR編程模型原理:利用一個輸入的key-value對集合來產生一個輸出的key-value對集合。MR庫通過Map和Reduce兩個函數來實現這個框架。用戶自定義的map函數接受一個輸入的key-value對,然後產生一箇中間的key-value對的集合。MR把所有具有相同的key值的value結合在一起,然後傳遞個reduce函數。Reduce函數接受key和相關的value結合,reduce函數合併這些value值,形成一個較小的value集合。通常我們通過一個迭代器把中間的value值提供給reduce函數(迭代器的作用就是收集這些value值),這樣就可以處理無法全部放在內存中的大量的value值集合了。


大數據掃盲!詳解Hadoop核心架構


大數據掃盲!詳解Hadoop核心架構


大數據掃盲!詳解Hadoop核心架構


流程簡而言之,大數據集被分成眾多小的數據集塊,若干個數據集被分在集群中的一個節點進行處理併產生中間結果。單節點上的任務,map函數一行行讀取數據獲得數據的(k1,v1),數據進入緩存,通過map函數執行map(基於key-value)排序(框架會對map的輸出進行排序)執行後輸入(k2,v2)。每一臺機器都執行同樣的操作。不同機器上的(k2,v2)通過merge排序的過程(shuffle的過程可以理解成reduce前的一個過程),最後reduce合併得到,(k3,v3),輸出到HDFS文件中。

談到reduce,在reduce之前,可以先對中間數據進行數據合併(Combine),即將中間有相同的key的對合並。Combine的過程與reduce的過程類似,但Combine是作為map任務的一部分,在執行完map函數後僅接著執行。Combine能減少中間結果key-value對的數目,從而降低網絡流量。

在此我向大家推薦一個大數據開發交流圈:658558542 裡面整理了一大份學習資料,全都是些乾貨,包括大數據技術入門,大數據離線處理、數據實時處理、Hadoop 、Spark、Flink、推薦系統算法以及源碼解析等,送給每一位大數據小夥伴,讓自學更輕鬆。這裡不止是小白聚集地,還有大牛在線解答!歡迎初學和進階中的小夥伴一起進群學習交流,共同進步!

Map任務的中間結果在做完Combine和Partition後,以文件的形式存於本地磁盤上。中間結果文件的位置會通知主控JobTracker,JobTracker再通知reduce任務到哪一個DataNode上去取中間結果。所有的map任務產生的中間結果均按其key值按hash函數劃分成R份,R個reduce任務各自負責一段key區間。每個reduce需要向許多個map任務節點取的落在其負責的key區間內的中間結果,然後執行reduce函數,最後形成一個最終結果。有R個reduce任務,就會有R個最終結果,很多情況下這R個最終結果並不需要合併成一個最終結果,因為這R個最終結果可以作為另一個計算任務的輸入,開始另一個並行計算任務。這就形成了上面圖中多個輸出數據片段(HDFS副本)。

Hbase數據管理

Hbase就是Hadoop database。與傳統的mysql、oracle究竟有什麼差別。即列式數據與行式數據由什麼區別。NoSql數據庫與傳統關係型數據由什麼區別:

Hbase VS Oracle

1、Hbase適合大量插入同時又有讀的情況。輸入一個Key獲取一個value或輸入一些key獲得一些value。

2、Hbase的瓶頸是硬盤傳輸速度。Hbase的操作,它可以往數據裡面insert,也可以update一些數據,但update的實際上也是insert,只是插入一個新的時間戳的一行。Delete數據,也是insert,只是insert一行帶有delete標記的一行。Hbase的所有操作都是追加插入操作。Hbase是一種日誌集數據庫。它的存儲方式,像是日誌文件一樣。它是批量大量的往硬盤中寫,通常都是以文件形式的讀寫。這個讀寫速度,就取決於硬盤與機器之間的傳輸有多快。而Oracle的瓶頸是硬盤尋道時間。它經常的操作時隨機讀寫。要update一個數據,先要在硬盤中找到這個block,然後把它讀入內存,在內存中的緩存中修改,過段時間再回寫回去。由於你尋找的block不同,這就存在一個隨機的讀。硬盤的尋道時間主要由轉速來決定的。而尋道時間,技術基本沒有改變,這就形成了尋道時間瓶頸。

3、Hbase中數據可以保存許多不同時間戳的版本(即同一數據可以複製許多不同的版本,准許數據冗餘,也是優勢)。數據按時間排序,因此Hbase特別適合尋找按照時間排序尋找Top n的場景。找出某個人最近瀏覽的消息,最近寫的N篇博客,N種行為等等,因此Hbase在互聯網應用非常多。

4、Hbase的侷限。只能做很簡單的Key-value查詢。它適合有高速插入,同時又有大量讀的操作場景。而這種場景又很極端,並不是每一個公司都有這種需求。在一些公司,就是普通的OLTP(聯機事務處理)隨機讀寫。在這種情況下,Oracle的可靠性,系統的負責程度又比Hbase低一些。而且Hbase侷限還在於它只有主鍵索引,因此在建模的時候就遇到了問題。比如,在一張表中,很多的列我都想做某種條件的查詢。但卻只能在主鍵上建快速查詢。所以說,不能籠統的說那種技術有優勢。

5、 Oracle是行式數據庫,而Hbase是列式數據庫。列式數據庫的優勢在於數據分析這種場景。數據分析與傳統的OLTP的區別。數據分析,經常是以某個列作為查詢條件,返回的結果也經常是某一些列,不是全部的列。在這種情況下,行式數據庫反應的性能就很低效。

行式數據庫:Oracle為例,數據文件的基本組成單位:塊/頁。塊中數據是按照一行行寫入的。這就存在一個問題,當我們要讀一個塊中的某些列的時候,不能只讀這些列,必須把這個塊整個的讀入內存中,再把這些列的內容讀出來。換句話就是:為了讀表中的某些列,必須要把整個表的行全部讀完,才能讀到這些列。這就是行數據庫最糟糕的地方。

列式數據庫:是以列作為元素存儲的。同一個列的元素會擠在一個塊。當要讀某些列,只需要把相關的列塊讀到內存中,這樣讀的IO量就會少很多。通常,同一個列的數據元素通常格式都是相近的。這就意味著,當數據格式相近的時候,數據就可以做大幅度的壓縮。所以,列式數據庫在數據壓縮方面有很大的優勢,壓縮不僅節省了存儲空間,同時也節省了IO。(這一點,可利用在當數據達到百萬、千萬級別以後,數據查詢之間的優化,提高性能,示場景而定)

Hive數據管理

Hive是建立在Hadoop上的數據倉庫基礎架構。它提供了一系列的工具,用來進行數據提取、轉換、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據機制。可以把Hadoop下結構化數據文件映射為一張成Hive中的表,並提供類sql查詢功能,除了不支持更新、索引和事務,sql其它功能都支持。可以將sql語句轉換為MapReduce任務進行運行,作為sql到MapReduce的映射器。提供shell、JDBC/ODBC、Thrift、Web等接口。優點:成本低可以通過類sql語句快速實現簡單的MapReduce統計。作為一個數據倉庫,Hive的數據管理按照使用層次可以從元數據存儲、數據存儲和數據交換三個方面介紹。

(1)元數據存儲

Hive將元數據存儲在RDBMS中,有三種方式可以連接到數據庫:

·內嵌模式:元數據保持在內嵌數據庫的Derby,一般用於單元測試,只允許一個會話連接

·多用戶模式:在本地安裝Mysql,把元數據放到Mysql內

·遠程模式:元數據放置在遠程的Mysql數據庫

(2)數據存儲

首先,Hive沒有專門的數據存儲格式,也沒有為數據建立索引,用於可以非常自由的組織Hive中的表,只需要在創建表的時候告訴Hive數據中的列分隔符和行分隔符,這就可以解析數據了。

其次,Hive中所有的數據都存儲在HDFS中,Hive中包含4中數據模型:Tabel、ExternalTable、Partition、Bucket。

Table:類似與傳統數據庫中的Table,每一個Table在Hive中都有一個相應的目錄來存儲數據。例如:一個表zz,它在HDFS中的路徑為:/wh/zz,其中wh是在hive-site.xml中由$指定的數據倉庫的目錄,所有的Table數據(不含External Table)都保存在這個目錄中。

Partition:類似於傳統數據庫中劃分列的索引。在Hive中,表中的一個Partition對應於表下的一個目錄,所有的Partition數據都存儲在對應的目錄中。例如:zz表中包含ds和city兩個Partition,則對應於ds=20140214,city=beijing的HDFS子目錄為:/wh/zz/ds=20140214/city=Beijing;

Buckets:對指定列計算的hash,根據hash值切分數據,目的是為了便於並行,每一個Buckets對應一個文件。將user列分數至32個Bucket上,首先對user列的值計算hash,比如,對應hash=0的HDFS目錄為:/wh/zz/ds=20140214/city=Beijing/part-00000;對應hash=20的,目錄為:/wh/zz/ds=20140214/city=Beijing/part-00020。

ExternalTable指向已存在HDFS中的數據,可創建Partition。和Table在元數據組織結構相同,在實際存儲上有較大差異。Table創建和數據加載過程,可以用統一語句實現,實際數據被轉移到數據倉庫目錄中,之後對數據的訪問將會直接在數據倉庫的目錄中完成。刪除表時,表中的數據和元數據都會刪除。ExternalTable只有一個過程,因為加載數據和創建表是同時完成。世界數據是存儲在Location後面指定的HDFS路徑中的,並不會移動到數據倉庫中。

(3)數據交換

·用戶接口:包括客戶端、Web界面和數據庫接口

·元數據存儲:通常是存儲在關係數據庫中的,如Mysql,Derby等

·Hadoop:用HDFS進行存儲,利用MapReduce進行計算。

關鍵點:Hive將元數據存儲在數據庫中,如Mysql、Derby中。Hive中的元數據包括表的名字、表的列和分區及其屬性、表的屬性(是否為外部表)、表數據所在的目錄等。

Hive的數據存儲在HDFS中,大部分的查詢由MapReduce完成。

總結:

通過對Hadoop分佈式計算平臺最核心的分佈式文件系統HDFS、MapReduce處理過程,以及數據倉庫工具Hive和分佈式數據庫Hbase的介紹。基本涵蓋了Hadoop分佈式平臺的所有技術核心。從體系架構到數據定義到數據存儲再到數據處理,從宏觀到微觀的系統介紹,為Hadoop平臺上大規模的數據存儲和任務處理打下基礎。

感謝您的觀看,如有不足之處,歡迎批評指正。

對大數據感興趣的同學可以關注我,並在後臺私信發送關鍵字:“大數據”即可獲取免費的大數據學習資料。

知識體系已整理好(筆記,PPT,學習視頻),歡迎大家來領取!


分享到:


相關文章: