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

轉自:http://blog.csdn.net/yczws1/article/details/19178265mysql

 

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

      經過這一階段的調研總結,從內部機理的角度詳細分析,HDFS、MapReduce、Hbase、Hive是如何運行,以及基於Hadoop數據倉庫的構建和分佈式數據庫內部具體實現。若有不足,後續及時修改。shell

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

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

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

     三、  Hbase中數據能夠保存許多不一樣時間戳的版本(即同一數據能夠複製許多不一樣的版本,准許數據冗餘,也是優點)。數據按時間排序,所以Hbase特別適合尋找按照時間排序尋找Top n的場景。找出某我的最近瀏覽的消息,最近寫的N篇博客,N種行爲等等,所以Hbase在互聯網應用很是多。

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

     五、 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平臺上大規模的數據存儲和任務處理打下基礎。

相關文章
相關標籤/搜索