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

  • 相关阅读:
    Linux磁盘分区MBR分区
    win10 1809磁盘占用总是100%
    LINUX系统的7种运行级别
    【工作环境】公司主域控硬盘损坏后的维修步骤
    程序员的一些人生感悟
    dispatch_get_main_queue 的同步异步问题
    虚拟机VirtualBox中Ubuntu无法全屏解决方法
    十大报错、报异常、跑不起来原因
    关于scrollbarfacecolor只支持ie的解决方法
    一个严肃的面试经验
  • 原文地址:https://www.cnblogs.com/SpeakSoftlyLove/p/6063908.html
Copyright © 2020-2023  润新知