有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的儲存資料庫
其中主要涉及到的表如下:
但是對於一個菜鳥來說,看完這些還是有點雲裡霧裡。
下面來看他們的異同。
查詢語言。由於 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 進行平行計算,因此可以支援很大規模的 資料;對應的,資料庫可以支援的資料規模較小。
看了這些,我說為什麼hive查詢資料怎麼這麼慢呢。
最後再來一下資料庫和資料倉儲的區別。
> 資料庫是面向事務的設計,資料倉庫是面向主題設計的。 資料庫一般儲存線上交易資料,資料倉庫儲存的一般是歷史資料。
> 資料庫設計是儘量避免冗餘,一般採用符合正規化的規則來設計,資料倉庫在設計是有意引入冗餘,採用反正規化的方式來設計。
> 資料庫是為捕獲資料而設計,資料倉庫是為分析資料而設計,它的兩個基本的元素是維表和事實表。(維是看問題的角度,比如時間,部門,維表放的就是這些東西的定義,事實表裡放著要查詢的資料,同時有維的ID)
以上文章部分內容來自與網路。