Hadoop
Hadoop是Apache旗下的一個用java語言實現開源軟件框架,是一個開發和運行處理大規模數據的軟件平台。允許使用簡單的編程模型在大量計算機集群上對大型數據集進行分布式處理。它的核心組件有:
- HDFS(分布式文件系統):解決海量數據存儲
- YARN(作業調度和集群資源管理的框架):解決資源任務調度
- MAPREDUCE(分布式運算編程框架):解決海量數據計算
廣義上來說,Hadoop通常是指一個更廣泛的概念——Hadoop生態圈
當下的Hadoop已經成長為一個龐大的體系,隨着生態系統的成長,新出現的項目越來越多,其中不乏一些非Apache主管的項目,這些項目對HADOOP是很好的補充或者更高層的抽象。比如:
- HDFS:分布式文件系統
- MAPREDUCE:分布式運算程序開發框架
- HIVE:基於HADOOP的分布式數據倉庫,提供基於SQL的查詢數據操作
- HBASE:基於HADOOP的分布式海量數據庫
- ZOOKEEPER:分布式協調服務基礎組件
- Mahout:基於mapreduce/spark/flink等分布式運算框架的機器學習算法庫
- OOZIE:工作流調度框架
- Sqoop:數據導入導出工具(比如用於mysql和HDFS之間)
- FLUME:日志數據采集框架
- IMPALA:基於hive的實時sql查詢分析
Spark
Spark 只是一個計算框架,它的能力是在現有數據的基礎上提供一個高性能的計算引擎,然后提供一些上層的處理工具比如做數據查詢的Spark SQL、做機器學習的MLlib等;而hadoop的功能則更加全面,它是包括了數據存儲(HDFS)、任務計划和集群資源管理(YARN)以及離線並行計算(MapReduce)的一整套技術棧。
因此可以看出,Spark 其實是依賴於第三方的數據源的,但這也是 Spark 靈活的地方,它能夠配合HBase、Hive,以及關系型數據庫Oracle、Mysql等多種類型的數據工作。
從上圖可以看出,人們現在甚至已經把spark納入到hadoop的生態之中了(雖然這種說法是否妥當還需驗證),足以見證:spark僅僅只是一個計算框架,它不能,也沒有必要來替代hadoop,它存在最大的價值就是彌補MapReduce計算性能上的不足,提供超越其數倍甚至數十倍的計算能力。因此,我們可以將spark與MapReduce對標起來。
HIVE
- hive不是數據庫,而是數據倉庫,主要依賴於hadoop來實現
- 底層文件系統是hadoop的hdfs,實現對hdfs上結構化數據的SQL操作HQL,速度較慢
- 計算引擎是hadoop的mapreduce
- 依靠存儲在其他關系型數據庫metastore來對hdfs結構化數據進行管理,實現類似數據庫的功能
- 不具備數據庫的一些主鍵、索引、update操作等特性,但是提供了分區、塊索引、SQL等特性
- 比較適合存儲海量的全量(歷史+更新)軌跡數據,比對數據進行批量的挖掘、分析等操作
總結一下,hive是基於hadoop實現的數據倉庫,適合存儲海量全量數據,支持類SQL操作,性能相對較差,數據存儲有一定的限制,不支持更新、索引等事務。適合海量數據的挖掘和分析,通俗一點來說,hive其實就是借助mysql等數據庫在hadoop上層套了一個殼,來實現對hdfs上結構化數據的映射,為上層提供sql服務。
HBASE
即Hadoop databse,顧名思義就是一個hadoop的數據庫
- nosql數據庫之一,基於列式存儲(列族),適合海量半結構化數據的存儲和檢索
- 不支持SQL、適合海量、帶時間序列的數據的存儲和檢索、性能較好
- 原生支持基於rowkey的一級索引,rowkey按照字典序進行排序
- 運算執行引擎是hbase自身提供、底層存儲基於hdfs
總結一下,hbase是NOSQL數據庫的一種,基於分布式列式存儲,適合海量半結構化帶時間序列的數據的存儲和檢索,性能較優秀,hbase底層存儲依賴於hdfs,與rdbms的區別與其他nosql類似,比如不支持SQL、事務性相對較差等等。
hbase是數據庫、hive是數據倉庫,而這有很大的區別、也有很多類似的地方比如都屬於hadoop生態圈、存儲都基於hdfs等。一般來說用hive作為海量結構化全量數據的存儲、運算、挖掘、分析;hbase用來作為海量半結構化數據的存儲、檢索;這二者可以很好協同工作,hive上計算完的結果放在hbase中供檢索,也可以將hbase里面的結構化數據和hive相結合,實現對hbase的sql操作等等。在大數據架構中,Hive和HBase是協作關系,數據流一般如下圖: