1. 程式人生 > >Thinking in BigData(八)大資料Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理詳解

Thinking in BigData(八)大資料Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理詳解

      純乾貨:Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理詳解

      通過這一階段的調研總結,從內部機理的角度詳細分析,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。


如圖: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值集合了。

       說明:(第三幅圖為同伴自己畫的

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

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

       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中由${hive.metastore.warehouse.dir}指定的資料倉庫的目錄,所有的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平臺上大規模的資料儲存和任務處理打下基礎。

         部分參考《Hadoop實戰指南》

Copyright©BUAA