欢迎投稿

今日深度:

hive优化,

hive优化,


hive是基于大数据开发的一组用于数据仓库的api,其主要功能是将HQL(HIVE SQL)转换成mapreduce执行。所以对hive的优化几乎等于对mapreduce的优化,主要在io和数据倾斜方面进行优化。本文主要在以下几个方面进行介绍

  • 合并小文件

  • 压缩文件

  • join倾斜优化

  • group by倾斜优化

合并小文件

map针对每一个文件产生一个或多个map任务,如果输入小文件过多,则会产生许多map任务处理每个小文件,严重耗费了资源。通过如下设置可以对输入小文件进行合并操作

  set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 

压缩文件

可以通过压缩中间文件减少io消耗,提高效率

hive中存储格式和压缩格式如下:

存储格式
  • Text File text格式,此为默认的格式。可以使用Gzip或者Bzip2压缩格式,不支持分割

  • SequenceFile 二进制文件格式,支持NONE/RECORD/BLOCK压缩格式

  • RCFile

  • Avro Files

  • ORC Files

  • Parquet 列存储格式,推荐使用此种文件格式

  • Custom INPUTFORMAT and OUTPUTFORMAT 用户自定义文件格式

压缩格式

压缩格式主要有 bzip2、gzip、lzo、snappy等

在进行shuffle中,由于进行数据传输,会产生较大的io。此时对map输出文件进行压缩,能够减小数据文件大小,降低io,提高执行效率,一般建议采用SnappyCodec压缩格式,此格式有较高的压缩比和低cpu消耗

  set hive.exec.compress.intermediate=true;
  set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

数据倾斜指由于数据表中某些值数据量较大时,导致某些reducer上数据量较大。在执行过程中会出现其它reducer都已完成,某些reducer还在执行且进度条一直呈现99%,严重影响了整个任务的执行效率。数据倾斜优化就是要解决某些值数据量较大的情况。

join 倾斜优化

join过程中出现的数据倾斜,具体解决办法为转map join和设置参数优化,关于join,猛戳此处

  1. map join

    当大表和小表join出现数据倾斜时,可以将小表缓存至内存,在map端进行join操作,设置如下:

      set hive.auto.convert.join.noconditionaltask = true;
      set hive.auto.convert.join.noconditionaltask.size = 10000000;
  2. hive.optimize.skewjoin 参数

    如果大表和大表进行join操作,则可采用skewjoin

    skewjoin原理

    1. 对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录。其它数据正常执行

    2. 对倾斜数据开启map join操作,对非倾斜值采取普通join操作

    3. 将倾斜数据集和非倾斜数据及进行合并操作

    相关文档:文档一,文档二

  • hive.optimize.skewjoin.compiletime

    如果建表语句元数据中指定了skew key,则使用set hive.optimize.skewjoin.compiletime=true开启skew join。

    可以通过如下建表语句指定SKEWED key:

      CREATE TABLE list_bucket_single (key STRING, value STRING)
        SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];
  • hive.optimize.skewjoin

    该参数为在运行时动态指定数据进行skewjoin,一般和hive.skewjoin.key参数一起使用

      set hive.optimize.skewjoin=true;
      set hive.skewjoin.key=100000;

    以上参数表示当记录条数超过100000时采用skewjoin操作

  • 区别

    hive.optimize.skewjoin.compiletimehive.optimize.skewjoin区别为前者为编译时参数,后者为运行时参数。前者在生成执行计划时根据元数据生成skewjoin,此参数要求倾斜值一定;后者为运行过程中根据数据条数进行skewjoin优化。hive.optimize.skewjoin实际上应该重名为为hive.optimize.skewjoin.runtime参数,考虑兼容性没有进行重命名

group by 倾斜优化

group by语句中出现的倾斜,通过改变写法或参数设置

  • 写法调整

    对于确定的倾斜值,先均匀分布到各个reducer上,然后开启新一轮reducer进行统计操作。写法如下

      
      -- 正常写法
      select key
           , count(1) as cnt
        from tb_name
       group  by  key;
      ​
      -- 改进后写法
      select a.key
           , sum(cnt) as cnt
       from (select key
                  , if(key = 'key001',random(),0)
                  , count(1) as cnt
               from tb_name
              group by key, 
                       if(key = 'key001',random(),0)
             ) t
       group by t.key;
  • 参数设置

    如果在不确定倾斜值的情况下,可以设置hive.groupby.skewindata参数

      set hive.groupby.skewindata=true;
      select key
           , count(1) as cnt
        from tb_name
       group by key;

    其原理和上述写法调整中类似,是先对key值进行均匀分布,然后开启新一轮reducer求值

以上优化方式为一般且常见的优化方式,对于具体问题应该进行具体分析

www.htsjk.Com true http://www.htsjk.com/hive/34351.html NewsArticle hive优化, hive是基于大数据开发的一组用于数据仓库的api,其主要功能是将HQL(HIVE SQL)转换成mapreduce执行。所以对hive的优化几乎等于对mapreduce的优化,主要在io和数据倾斜方面进行优化。...
相关文章
    暂无相关文章
评论暂时关闭