Hadoop的核心就是HDFS和MapReduce,而兩者只是理論基礎,不是具體可使用的高級應用,Hadoop旗下有很多經(jīng)典子項目,比如HBase、Hive等,這些都是基于HDFS和MapReduce發(fā)展出來的。要想了解Hadoop,就必須知道HDFS和MapReduce是什么。
1. 核心部分
分布式文件系統(tǒng)HDFS
Mapreduce
數(shù)據(jù)倉庫工具Hive
分布式數(shù)據(jù)庫 Hbase
2. 一個Hadoop集群由一個NameNode和若干個DataNode組成。
NameNode 作為主服務器,用來管理文件系統(tǒng)命名空間和客戶端對文件的訪問操作。
DataNode 管理存儲的數(shù)據(jù),支持文件格式的數(shù)據(jù)。
3. 文件讀取 / 寫入過程
3.1 文件讀取
Client向NameNode發(fā)起文件寫入的請求。
NameNode根據(jù)文件大小和文件塊配置情況,返回給Client它管理的DataNode的信息。
Client將文件劃分為多個block,根據(jù)DataNode的地址,按順序將block寫入DataNode塊中。
3.2 文件寫入
Client向NameNode發(fā)起讀取文件的請求。
NameNode返回文件存儲的DataNode信息。
Client 讀取文件信息。
文件塊的放置,一個block一般會有三個備份,一份在NameNode指定的DateNode上,一份放在與指定的DataNode不在同一臺機器的DataNode上,一根在于指定的DataNode在同一Rack上的DataNode上。
4. MapReduce 體系結構
MR框架是由一個單獨運行在主節(jié)點上的JobTracker和運行在每個集群從節(jié)點上的TaskTracker共同組成。主節(jié)點負責調度構成一個作業(yè)的所有任務,這些任務分布在不同的不同的從節(jié)點上。主節(jié)點監(jiān)視它們的執(zhí)行情況,并重新執(zhí)行之前失敗的任務。從節(jié)點僅負責由主節(jié)點指派的任務。當一個Job被提交時,JobTracker接受到提交作業(yè)和配置信息之后,就會將配置信息等分發(fā)給從節(jié)點,同時調度任務并監(jiān)控TaskTracker的執(zhí)行。
DataNode既是數(shù)據(jù)存儲節(jié)點又是計算節(jié)點。
MR編程模型原理
利用一個輸入的key-value對集合來產(chǎn)生一個輸出的key-value對集合。MR庫通過Map和Reduce兩個函數(shù)來實現(xiàn)這個框架。用戶自定義的map函數(shù)接受一個輸入的key-value對,然后產(chǎn)生一個中間的key-value對的集合。MR把所有具有相同的key值的value結合在一起,然后 傳遞個reduce函數(shù)。Reduce函數(shù)接受key和相關的value結合,reduce函數(shù)合并這些value值,形成一個較小的value集合。通常我們通過一個迭代器把中間的value值提供給reduce函數(shù)(迭代器的作用就是收集這些value值),這樣就可以處理無法全部放在內存中的大量的value值集合了。
5. Hive
5.1 Hive 概念
Hive是建立在Hadoop上的數(shù)據(jù)倉庫基礎架構。它提供了一系列的工具,用來進行數(shù)據(jù)提取、轉換、加載,這是一種可以存儲、查詢和 分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)機制。可以把Hadoop下結構化數(shù)據(jù)文件映射為一張成Hive中的表,并提供類sql查詢功能,除了不支持更新、索引和事務,sql其它功能都支持。可以將sql語句轉換為MapReduce任務進行運行,作為sql到MapReduce的映射器。提供shell、JDBC/ODBC、Thrift、Web等接口。優(yōu)點:成本低可以通過類sql語句快速實現(xiàn)簡單的MapReduce統(tǒng)計。
5.2 數(shù)據(jù)倉庫
5.2.1 元數(shù)據(jù)存儲
三種連接數(shù)據(jù)的方式:
內嵌模式:元數(shù)據(jù)保持在內嵌數(shù)據(jù)庫的Derby,一般用于單元測試,只允許一個會話連接
多用戶模式:在本地安裝Mysql,把元數(shù)據(jù)放到Mysql內
遠程模式:元數(shù)據(jù)放置在遠程的Mysql數(shù)據(jù)庫
5.2.2 數(shù)據(jù)存儲
Hive沒有專門的數(shù)據(jù)存儲格式,也沒有為數(shù)據(jù)建立索引,用于可以非常自由的組織Hive中的表,只需要在創(chuàng)建表的時候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,這就可以解析數(shù)據(jù)了。
Hive中的四種數(shù)據(jù)模型:Table、ExternalTable、Partition、Bucket。
Table。類似與傳統(tǒng)數(shù)據(jù)庫中的Table,每一個Table在Hive中都有一個相應的目錄來存儲數(shù)據(jù)。
Partition。類似于傳統(tǒng)數(shù)據(jù)庫中劃分列的索引。
Buckets。對指定列計算的hash,根據(jù)hash值切分數(shù)據(jù),目的是為了便于并行,每一個Buckets對應一個文件。
ExternalTable。指向已存在HDFS中的數(shù)據(jù),可創(chuàng)建Partition。
Hive中的元數(shù)據(jù)包括表的名字、表的列和分區(qū)及其屬性、表的屬性(是否為外部表)、表數(shù)據(jù)所在的目錄等。