1. 程式人生 > >有Mysql資料庫的情況下為什麼要用Hive資料庫?

有Mysql資料庫的情況下為什麼要用Hive資料庫?

有Mysql資料庫的情況下為什麼要用Hive?

最近接到公司的一個需求,要求使用Hive做資料查詢。當時第一反應就是What?Hive是什麼鬼?一臉懵逼狀。(請原諒一個剛開始實習的Java實習生見識短淺)然後發現了hive的一些問題。下面簡單介紹一下Hive。


網上對於hive與mysql的區別的文章也不是很多。so只能問問公司大牛們,看看他們是怎樣理解的。

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

一、Hive是一個基於Hadoop的資料倉庫平臺。通過hive,我們可以方便地進行ETL的工作。hive定義了一個類似於SQL的查詢語言:HQL,能 夠將使用者編寫的QL轉化為相應的Mapreduce程式基於Hadoop執行。

Hive是Facebook 2008年8月剛開源的一個數據倉庫框架,其系統目標與 Pig 有相似之處,但它有一些Pig目前還不支援的機制,比如:更豐富的型別系統、更類似SQL的查詢語言、Table/Partition元資料的持久化等。
Hive 可以看成是從SQL到Map-Reduce的 對映器
這裡寫圖片描述
Hive的資料放在哪兒?

資料在HDFS的warehouse目錄下,一個表對應一個子目錄。

本地的/tmp目錄存放日誌和執行計劃

hive的表分為兩種,內表和外表。
Hive 建立內部表時,會將資料移動到資料倉庫指向的路徑;若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。
在刪除表的時候,內部表的元資料和資料會被一起刪除, 而外部表只刪除元資料,不刪除資料。這樣外部表相對來說更加安全些,資料組織也更加靈活,方便共享源資料。

使用Mysql作為Hive metaStore的儲存資料庫

其中主要涉及到的表如下:
這裡寫圖片描述

但是對於一個菜鳥來說,看完這些還是有點雲裡霧裡。

下面來看他們的異同。
這裡寫圖片描述

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

  2. 資料儲存位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的資料都是儲存在 HDFS 中的。而資料庫 則可以將資料儲存在本地檔案系統中。

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

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

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

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

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

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

  9. 資料規模。由於 Hive 建立在叢集上並可以利用 MapReduce 進行平行計算,因此可以支援很大規模的 資料;對應的,資料庫可以支援的資料規模較小。

看了這些,我說為什麼hive查詢資料怎麼這麼慢呢。

最後再來一下資料庫和資料倉儲的區別。


> 資料庫是面向事務的設計,資料倉庫是面向主題設計的。 資料庫一般儲存線上交易資料,資料倉庫儲存的一般是歷史資料。
> 資料庫設計是儘量避免冗餘,一般採用符合正規化的規則來設計,資料倉庫在設計是有意引入冗餘,採用反正規化的方式來設計。
> 資料庫是為捕獲資料而設計,資料倉庫是為分析資料而設計,它的兩個基本的元素是維表和事實表。(維是看問題的角度,比如時間,部門,維表放的就是這些東西的定義,事實表裡放著要查詢的資料,同時有維的ID)

以上文章部分內容來自與網路。