Hive和HBase的區別


Hive和HBase的區別

Hive是為了簡化編寫MapReduce程序而生的,使用MapReduce做過數據分析的人都知道,很多分析程序除業務邏輯不同外,程序流程基本一樣。在這種情況下,就需要Hive這樣的用戶編程接口。Hive本身不存儲和計算數據,它完全依賴於HDFS和MapReduce,Hive中的表純邏輯,就是些表的定義等,也就是表的元數據。使用SQL實現Hive是因為SQL大家都熟悉,轉換成本低,類似作用的Pig就不是SQL。

 

HBase為查詢而生的,它通過組織起節點內所有機器的內存,提供一個超大的內存Hash表,它需要組織自己的數據結構,包括磁盤和內存中的,而Hive是不做這個的,表在HBase中是物理表,而不是邏輯表,搜索引擎使用它來存儲索引,以滿足查詢的實時性需求。 

 

hive類似CloudBase,也是基於hadoop分布式計算平台上的提供data warehouse的sql功能的一套軟件。使得存儲在hadoop里面的海量數據的匯總,即席查詢簡單化。hive提供了一套QL的查詢語言,以sql為基礎,使用起來很方便。

 

HBase是一個分布式的基於列存儲的非關系型數據庫。HBase的查詢效率很高,主要由於查詢和展示結果。 

 

hive是分布式的關系型數據庫。主要用來並行分布式處理大量數據。hive中的所有查詢除了"select * from table;"都是需要通過Map\Reduce的方式來執行的。由於要走Map\Reduce,即使一個只有1行1列的表,如果不是通過select * from table;方式來查詢的,可能也需要8、9秒。但hive比較擅長處理大量數據。當要處理的數據很多,並且Hadoop集群有足夠的規模,這時就能體現出它的優勢。

 

通過hive的存儲接口,hive和Hbase可以整合使用。 

1、hive是sql語言,通過數據庫的方式來操作hdfs文件系統,為了簡化編程,底層計算方式為mapreduce。 

2、hive是面向行存儲的數據庫。 

3、Hive本身不存儲和計算數據,它完全依賴於HDFS和MapReduce,Hive中的表純邏輯。 

4、HBase為查詢而生的,它通過組織起節點內所有機器的內存,提供一個超大的內存Hash表 。

5、hbase不是關系型數據庫,而是一個在hdfs上開發的面向列的分布式數據庫,不支持sql。 

6、hbase是物理表,不是邏輯表,提供一個超大的內存hash表,搜索引擎通過它來存儲索引,方便查詢操作。 

7、hbase是列存儲。 

 

Hive和Hbase有各自不同的特征:hive是高延遲、結構化和面向分析的,hbase是低延遲、非結構化和面向編程的。Hive數據倉庫在hadoop上是高延遲的。 

其中HBase位於結構化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce為HBase提供了高性能的計算能力,Zookeeper為HBase提供了穩定服務和failover機制。 

總結: 

覺得在問區別之前,我應該顯示說相同點,這么一想,又糊塗了,hive和hbase哪里像了,好像哪里都不像,既然哪里都不像,又何來的“區別是什么”這一問題,他倆所有的都算區別。 

那么,hive是什么? 

白話一點再加不嚴格一點,hive可以認為是map-reduce的一個包裝。hive的意義就是把好寫的hive的sql轉換為復雜難寫的map-reduce程序。 

於是,hbase是什么? 

同樣白話一點加不嚴格一點,hbase可以認為是hdfs的一個包裝。他的本質是數據存儲,是個NoSql數據庫;hbase部署於hdfs之上,並且克服了hdfs在隨機讀寫方面的缺點。 

所以要問hive和hbase的區別,就應該問問map-reduce和hdfs之間的區別,問區別,就要先說說他倆哪里像。 

 

 HIVE和傳統數據庫的比較

由於 Hive 采用了 SQL 的查詢語言 HQL,因此很容易將 Hive 理解為數據庫。其實從結構上來看,Hive 和數據庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 Hive 和數據庫的差異。數據庫可以用在 Online 的應用中,但是Hive 是為數據倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。

 

查詢語言
由於SQL被廣泛的應用在數據倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。

 

數據存儲位置
Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。

 

數據格式
Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法(Hive 中默認有三個文件格式TextFile,SequenceFile以及RCFile)。由於在加載數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive在加載的過程中不會對數據本身進行任何修改,而只是將數據內容復制或者移動到相應的HDFS目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。

 

數據更新
由於Hive是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive中不支持對數據的改寫和添加,所有的數據都是在加載的時候中確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO …  VALUES 添加數據,使用 UPDATE … SET修改數據。

 

索引
之前已經說過,Hive在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些Key建立索引。Hive要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapReduce 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。

 

執行
Hive中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的(類似 select * from tbl的查詢不需要MapReduce)。而數據庫通常有自己的執行引擎。

 

執行延遲
之前提到,Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce框架。由於MapReduce 本身具有較高的延遲,因此在利用MapReduce 執行Hive查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時 候,Hive的並行計算顯然能體現出優勢。

 

可擴展性
由於Hive是建立在Hadoop之上的,因此Hive的可擴展性是和Hadoop的可擴展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的規模在4000 台節點左右)。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫 Oracle 在理論上的擴展能力也只有100台左右。

 

數據規模
由於Hive建立在集群上並可以利用MapReduce進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

 

 

 

原文鏈接:https://blog.csdn.net/vipyeshuai/article/details/50847281


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM