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,优化无止境。