HIVE的几种优化

时间:2023-03-09 02:45:52
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,优化无止境。