5 WAYS TO MAKE YOUR HIVE QUERIES RUN FASTER
今天看了一篇[文章]
(http://zh.hortonworks.com/blog/5-ways-make-hive-queries-run-faster/),講述了優化Hive的5個建議。其中每個建議細說的話,都可以寫一篇或者多篇文章。下面簡要記錄下,后續慢慢補充:
1: USE TEZ
Tez 是一個開源的支持DAG作業的計算框架,它來源於MapReduce框架。可以通過設置
set hive.execution.engine=tez;
來啟動Tez。
注意Hive2.1.0的版本有一個BUGHIVE-14121。使用Tez的時候需要
set hive.mapjoin.hybridgrace.hashtable=false
2: USE ORCFILE
ORCfile 使用了predicate push-down, compression等多種技術。Hive使用 ORCfile 作為表結構不僅可以節省存儲空間,而且能夠快速提高Hive Query的速度。
CREATE TABLE A_ORC (
customerID int,
name string,
age int,
address string
) STORED AS ORC tblproperties (“orc.compress" = “SNAPPY”);
3: USE VECTORIZATION
矢量查詢(Vectorized query) 每次處理數據時會將1024行數據組成一個batch進行處理,而不是一行一行進行處理,這樣能夠顯著提高執行速度。
可以通過設置
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
開啟來。
具體請參考:
[1] https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution
4: COST BASED QUERY OPTIMIZATION
COST BASED QUERY OPTIMIZATION可以優化hive的每次查詢。如果想要使用CBO,需要開啟一下選項:
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;
如果我們想要使用CBO,需要通過HIVE的分析模式來收集表的不同統計數據,我們可以通過下面的命令來進行:
analyze table tweets compute statistics for columns;
這樣子,HIVE就可以通過消耗評估和不同的執行計划來讓我們的查詢跑的更快。
更多的查詢請看這里.
5: WRITE GOOD SQL
SQL是一種強有力的解釋性語言,在執行sql查詢的時候,可以通過不同的sql語法來實現。雖然查詢的結果是相同的,但是不同的SQL語句會有不同的性能表現。
例如,創建一個點擊事件表,表中的每條記錄都代表一個事件。
CREATE TABLE clicks (
timestamp date, sessionID string, url string, source_ip string
) STORED as ORC tblproperties (“orc.compress” = “SNAPPY”);
如果想要查詢出每個sessionID 最后訪問的url,一種可能的執行方式是這樣的:
SELECT clicks.* FROM clicks inner join
(select sessionID, max(timestamp) as max_ts from clicks
group by sessionID) latest
ON clicks.sessionID = latest.sessionID and
clicks.timestamp = latest.max_ts;
上面的查詢語句通過一個子查詢獲取每個sessionID最后的訪問時間,然后通過inner join
來過濾到其它的事件。下面是另一種方法:
SELECT * FROM
(SELECT *, RANK() over (partition by sessionID,
order by timestamp desc) as rank
FROM clicks) ranked_clicks
WHERE ranked_clicks.rank=1;
第二種方法通過HIVE的開窗函數避免了兩個大表的join,這樣就能提高查詢效率。
其實還有很多其它的優化方式,例如LLAP,優化無止境。
