HIVE的幾種優化


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,優化無止境。


免責聲明!

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



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