在 Apache Hive 中輕鬆生存的12個技巧

來源:互聯網
上載者:User

在 Apache Hive 中輕鬆生存的12個技巧

Learn to live with Apache Hive in 12 easy steps

Hive 可以讓你在 Hadoop 上使用 SQL,但是在分布式系統上最佳化 SQL 則有所不同。這裡是讓你可以輕鬆駕馭 Hive 的12個技巧。

Hive 並不是關係型資料庫(RDBMS),但是它大多數時候都表現得像是一個關係型資料庫一樣,它有表、可以運行 SQL、也支援 JDBC 和 ODBC。

這種表現既有好的一面,也有不好的一面:Hive 並不像關係型資料庫那樣執行 SQL 查詢。我在 Hive 上花費了大量時間,光是我自己在工作中就為了最佳化它花費了超過80個小時。不說你也知道,我就像呆在蜂巢(Hive)旁邊一樣腦袋嗡嗡作響。所以,為了讓你免受這種痛苦,我決定將它們寫出來,以便讓你在你的下一個 Hive 項目中逃離這種折磨。

 

1、不要使用 MapReduce

不管你是不是覺得 Tez、Spark 或 Impala 能行,但是不要指望 MapReduce。它本身就很慢,比 Hive 還慢。如果你用的是 Hortonwork 的版本,你可以在指令碼前面寫上  set hive.execution.engine=tez ;用 Cloudera 的話,使用 Impala。如果 Impala 不適用的話,我希望到時候可以使用  hive.execution.engine=spark 。

 

2、不要在 SQL 中做字串匹配

絕不要,特別是在 Hive 中!如果你堅持要在 WHERE 語句中使用 LIKE 匹配,就會產生一個跨產品的警告。本來你的查詢可能只用幾秒鐘,但是使用字串匹配的話就會變成幾分鐘。最好的辦法是使用那些可以在 Hadoop 中進行搜尋的工具,可以試試 Elasticsearch 的 Hive 整合版本 或 Lucidwork 的 Solr,以及 Cloudera Search。關係型資料庫這方面表現並不好,但是 Hive 則更糟糕。

 

3、不要用表串連子查詢

你最好建立一個暫存資料表,然後對這個暫存資料表進行串連,而不是讓 Hive 自己智能處理子查詢。即不要這樣做:

  1. select a.*from something a inner join
  2. (select ...from somethingelse union b select ...from anotherthing c) d
  3. on a.key1 = d.key1 and a.key2 = b.key2 where a.condition=1

而是應該這樣:

  1. create var_temp as select ...from somethingelse b
  2. union select ...from anotherthing c
  3. andthen
  4. select a.*from something a inner joinfrom var_temp b
  5. where a.key1=b.key1 and a.key2=b.key2 where a.condition=1

一般來說,這會比 Hive 自己處理子查詢要快許多。

4、使用  Parquet 或 ORC,但是不要轉換使用

也就是說,使用 Parquet 或 ORC 而不要用 TEXTFILE。然而,如果你要把文本資料中匯入到更具結構性的資料中,應該做一些轉換再匯入到目標表中。你不應該用 LOAD DATA 將文字檔載入到 ORC 中,而是應該將其載入到一個文本中。

如果你要建立另外一個表,並最終大多數分析都是對它進行的,那麼你就該對該表進行 ORC 化,因為轉換到 ORC 或 Parquet 要花費很多時間,並不值得將其放到你的 ETL 處理中。如果你有一個簡單的普通文本要匯入,也沒做過任何最佳化,你應該將其載入到一個暫存資料表並通過 select create 放到 ORC 或 Parquet 中。不過,這有點慢。

 

5、開關向量化試試

在你的指令碼前面加上 set hive.vectorized.execution.enabled = trueset hive.vectorized.execution.reduce.enabled = true ,然後試著開啟或關閉它們看看。因為最近版本的 Hive 的向量化有點問題。

6、不要在表串連中使用 structs

我必須承認我大腦裡面的 SQL 格式還是 SQL-92 時代的,所以我無論如何都不會想到去用  structs。但是如果你做一些超級複雜的操作,比如在聯合主鍵上使用 ON 語句,那麼 structs 就很方便。不幸的是,Hive 對它們很不適應,特別是在 ON 語句上。當然,大多數情況下,在較小的資料集和 yields 下是沒錯誤的。在 Tez 裡面,你會得到一個有趣的向量錯誤。這個限制並未見於我所知的任何文檔,也許這是一個探索你的執行引擎內部的好辦法。

 

7、檢查你的容器大小

你也許需要為 Impala 或 Tez 增加你的容器大小。如果有你的節點大小比較大,“推薦的”容器大小可能就不適用於你的系統。你也許需要確保你的 YARN 隊列和常規的 YARN 記憶體大小合適。你也許應該注意預設的隊列並不適合所有的常規使用。

 

8、啟用統計

Hive 在表串連時會做一些蠢事,除非啟用了統計。你也可以在 Impala 中使用查詢提示。

9、考慮 MapJoin 最佳化

如果你分析你的查詢,你可能發現最新的 Hive 已經可以足夠智能地進行自動最佳化了。但是你也許需要再調整一下。

 

10、如果可以,將大表放到最後

如標題。

 

11、分區總會幫到你,不管多少

如果你有一個出現在許多地方的東西,比如語句中的日期(但不是日期範圍)或重複的地點,你也許應該做分區。分區的基本意思是“拆分到它自己的目錄裡面”,而不是到一個大的檔案中去尋找。當你在你的 join/where 語句中僅檢索 location=’NC’這樣一個小資料集時,Hive 就可以在一個檔案中尋找。此外,和列值不同,你可以在你的  LOAD DATA 語句中加上分區。另外,要記住,HDFS 並不喜歡小檔案。

 

12、使用雜湊進行列比較

如果你要在每個查詢中比較同樣的10個欄位,可以考慮使用 hash() 來比較它們的校正值。在一個輸出表中展示它們也許很有用。注意,在 Hive 0.12 中,雜湊功能比較差,0.13中的雜湊更好一些。

以上就是我的12點經驗,我希望這些能夠幫到你��讓你從 Hive 的嗡嗡聲中逃離出來。 

Hive編程指南 PDF 中文高清版 

基於Hadoop叢集的Hive安裝

Hive內表和外表的區別

Hadoop + Hive + Map +reduce 叢集安裝部署

Hive本地獨立模式安裝

Hive學習之WordCount單詞統計

Hive運行架構及配置部署

Hive 的詳細介紹:請點這裡
Hive 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.