Hive优化

  • Hive优化目标

    • 在有限的资源下,执行效率更高
  • 常见问题
    • 数据倾斜
    • map数设置
    • reduce数设置
    • 其他
  • Hive执行

    • HQL --> Job --> Map/Reduce
    • 执行计划
      • explain [extended] hql
      • 样例
      • select col,count(1) from test2 group by col;
      • explain select col,count(1) from test2 group by col;
  • Hive表优化
    • 分区

      • 静态分区
      • 动态分区
        • set hive.exec.dynamic.partition=true;
        • set hive.exec.dynamic.partition.mode=nonstrict;
    • 分桶
      • set hive.enforce.bucketing=true;
      • set hive.enforce.sorting=true;
    • 数据
      • 相同数据尽量聚集在一起
  • hive job优化

    • 并行化执行

      • 每个查询被hive转化成多个阶段,有些阶段关联性不大,则可以并行化执行,减少执行时间
      • set hive.exec.parallel= true;
      • set hive.exec.parallel.thread.numbe=8;
    • 本地化执行
      • set hive.exec.mode.local.auto=true;
      • 当一个job满足如下条件才能真正使用本地模式:
        • job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
        • job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
        • job的reduce数必须为0或者1
    • job合并输入小文件
      • set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
      • 合并文件数由mapred.max.split.size限制的大小决定
    • job合并输出小文件
      • set hive.merge.smallfiles.avgsize=256000000;当输出文件平均小于该值,启动新job合并文件
      • set hive.merge.size.per.task=64000000;合并之后的文件大小
    • JVM重利用
      • set mapred.job.reuse.jvm.num.tasks=20;
      • JVM重利用可以使得JOB长时间保留slot,直到作业结束,这在对于有较多任务和较多小文件的任务是非常有意义的,减少执行时间。当然这个值不能设置过大,因为有些作业会有reduce任务,如果reduce任务没有完成,则map任务占用的slot不能释放,其他的作业可能就需要等待。
    • 压缩数据
      • 中间压缩就是处理hive查询的多个job之间的数据,对于中间压缩,最好选择一个节省cpu耗时的压缩方式

        • set hive.exec.compress.intermediate=true;
        • set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
        • set hive.intermediate.compression.type=BLOCK;
        • hive查询最终的输出也可以压缩
          • set hive.exec.compress.output=true;
          • set mapred.output.compreession.codec=org.apache.hadoop.io.compress.GzipCodec;
          • set mapred.output.compression.type=BLOCK;
  • Hive Map优化

    • set mapred.map.tasks =10; 无效
    • (1)默认map个数
      • default_num=total_size/block_size;
    • (2)期望大小
      • goal_num=mapred.map.tasks;
    • (3)设置处理的文件大小
      • split_size=max(mapred.min.split.size,block_size);
      • split_num=total_size/split_size;
    • (4)计算的map个数
      • compute_map_num=min(split_num,max(default_num,goal_num))
    • 经过以上的分析,在设置map个数的时候,可以简答的总结为以下几点:
      • 如果想增加map个数,则设置mapred.map.tasks为一个较大的值
      • 如果想减小map个数,则设置mapred.min.split.size为一个较大的值
      • 情况1:输入文件size巨大,但不是小文件
        • 增大mapred.min.split.size的值
        • 情况2:输入文件数量巨大,且都是小文件,就是单个文件的size小于blockSize。这种情况通过增大mapred.min.split.size不可行,需要使用combineFileInputFormat将多个input path合并成一个InputSplit送给mapper处理,从而减少mapper的数量。
    • map端聚合
      • set hive.map.aggr=true;
    • 推测执行

mapred.map.tasks.apeculative.execution

  • Hive Shuffle优化

    • Map端

      • io.sort.mb
      • io.sort.spill.percent
      • min.num.spill.for.combine
      • io.sort.factor
      • io.sort.record.percent
    • Reduce端
      • mapred.reduce.parallel.copies
      • mapred.reduce.copy.backoff
      • io.sort.factor
      • mapred.job.shuffle.input.buffer.percent
      • mapred.job.shuffle.input.buffer.percent
      • mapred.job.shuffle.input.buffer.percent
  • Hive Reduce优化

    • 需要reduce操作的查询

      • 聚合函数

        • sum,count,distinct...
        • 高级查询
          • group by,join,distribute by,cluster by...
          • order by比较特殊,只需要一个reduce
    • 推测执行
      • mapred.reduce.tasks.speculative.execution
      • hive.mapred.reduce.tasks.speculative.execution
    • Reduce优化
      • set mapred.reduce.tasks=10;直接设置

        • hive.exec.reducers.max 默认 :999
        • hive.exec.reducers.bytes.per.reducer 默认:1G
        • 计算公式
          • numRTasks = min[maxReducers,input.size/perReducer]
          • maxReducers=hive.exec.reducers.max
          • perReducer = hive.exec.reducers.bytes.per.reducer
  • hive查询操作优化

    • join优化

      • hive.optimize.skewjoin=true;如果是Join过程出现倾斜,应该设置为true
      • set hive.skewjoin.key=100000; 这个是join的键对应的记录条数超过这个值则会进行优化
      • mapjoin
        • set hive.auto.current.join=true;
        • hive.mapjoin.smalltable.filesize默认值是25mb
        • select /*+mapjoin(A)*/ f.a,f.b from A t join B f on (f.a=t.a)
        • 简单总结下,mapjoin的使用场景:
          • 关联操作中有一张表非常小
          • 不等值的链接操作
    • Bucket join
      • 两个表以相同方式划分桶
      • 两个表的桶个数是倍数关系
      • crete table order(cid int,price float) clustered by(cid) into 32 buckets;
      • crete table customer(id int,first string) clustered by(id) into 32 buckets;
      • select price from order t join customer s on t.cid=s.id
    • join 优化前
      • select m.cid,u.id from order m join customer u on m.cid=u.id where m.dt='2013-12-12';
    • join优化后
      • select m.cid,u.id from (select cid from order where dt='2013-12-12')m join customer u on m.cid=u.id;
    • group by 优化
      • hive.groupby.skewindata=true;如果是group by 过程出现倾斜 应该设置为true
      • set hive.groupby.mapaggr.checkinterval=100000;--这个是group的键对应的记录条数超过这个值则会进行优化
    • count distinct 优化
      • 优化前

        • select count(distinct id) from tablename
        • 优化后
          • select count(1) from (select distinct id from tablename) tmp;
          • select count(1) from (select id from tablename group by id) tmp;
          • 优化前
            • select a,sum(b),count(distinct c),count(distinct d) from test group by a
            • 优化后
              • select a,sum(b) as b,count(c) as c,count(d) as d from(select a,0 as b,c,null as d from test group by a,c union all select a,0 as b,null as c,d from test group by a,d union all select a,b,null as c,null as d from test)tmp1 group by a;

hive 优化 (转)的更多相关文章

  1. Hive 12、Hive优化

    要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1. ...

  2. hive优化之——控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  3. Hive优化案例

    1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...

  4. 一起学Hive——总结常用的Hive优化技巧

    今天总结本人在使用Hive过程中的一些优化技巧,希望给大家带来帮助.Hive优化最体现程序员的技术能力,面试官在面试时最喜欢问的就是Hive的优化技巧. 技巧1.控制reducer数量 下面的内容是我 ...

  5. 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

    第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...

  6. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  7. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  8. Hadoop生态圈-hive优化手段-作业和查询优化

    Hadoop生态圈-hive优化手段-作业和查询优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  9. 【转】Hive优化总结

    优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解Hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结.   长期观察hadoo ...

随机推荐

  1. python基础——Linux系统下的文件目录结构

    单用户操作系统和多用户操作系统 单用户操作系统:指一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源. 多用户操作系统:指一台计算机在同一时间可以由多个用户使用,多个用户 ...

  2. Compare DML To Both REDO And UNDO Size

    SUMMARY you can remember undo rule  the same to redo if you want demo rule that you can look up the ...

  3. 如何让4年前的电脑装win10开机跑进15秒

    我是用我的电脑测试的.看看我电脑的配置 我的是windows10,机械硬盘. 在这里要说的是给电脑优化,让其开机更快.当然,因电脑配置而异,我的最快是11秒.标题可能有点夸张了,结果因电脑配置而异,高 ...

  4. HTTP协议图--HTTP 协议基础

    1.通过请求和响应的交换达成通信 应用 HTTP 协议时,必定是一端担任客户端角色,另一端担任服务器端角色.仅从一条通信线路来说,服务器端和客服端的角色是确定的.HTTP 协议规定,请求从客户端发出, ...

  5. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  6. Eclipse和JDK的安装配置

    工欲善其事,必先利其器.最近开始学习Java语言,必不可少的要先安装一个IDE,我选择了eclipse,下面我们讲讲如何来安装及配置. Step1:工具的下载 这里我们需要用到三个工具安装包,JDK. ...

  7. Codeforces441A_Valera and Antique Items(水题)

    Valera and Antique Items time limit per test 1 second memory limit per test 256 megabytes input stan ...

  8. virtualbox+vagrant学习-4-Vagrantfile-7-WinRM Settings

    WinRM Settings 配置命名空间config.winrm config.winrm配置与如何通过winrm配置vagrant访问你的Windows客户相关.与大多数vagrant设置一样,默 ...

  9. ThinkPHP5入门(四)----模板篇

    一.模板访问 1.没有参数传递 $view = new View(); return $view->fetch(); 此时默认访问的模板路径为:[模板文件目录]/当前控制器名(小写+下划线)/当 ...

  10. windows安装PHP IIS MYSQL

    https://www.cnblogs.com/huodong/p/4310425.html