• hive优化3-map educeshuffleoutput等多阶段参数调优


    map阶段

     1.hive.vectorized.execution.enabled

        默认false. map方法逐行处理数据,开启之后hive构造一个批量输入的数组,一次处理1万条数据。(数据量不大,或计算不复杂是不是没必要开启?

        MapReduce只支持map端向量化执行,TEZ和SPARK支持map和reduce端向量化执行。

    2.hive.ignore.mapjoin.Hint

        默认true. 开启忽略Hint关键字,若要使用关键字,需关闭

    3.hive.auto.convert.join

        默认true. 开启mapjoin自动优化

    4.hive.smalltable.filesize/hive.mapjoin.smalltable.filesize

        默认2500000(25M),join时小表数据量小于该值自动开启mapjoin优化

       hive.auto.convert.join.use.nonstaged

        默认false. 是否省略小表加载作业。一些mapjoin,如果小表没有必要做数据过滤或者列投影,则直接省略小表加载时额外的MapReduce作业

    5.hive.map.aggr

        默认true. 是否开启map任务聚合

    6.hive.map.aggr.hash.percentmemory

        默认0.5,表示开启map任务聚合,聚合所用hash表最多占整个map内存50%

    7.hive.mapjoin.optimized.hashtable

        默认true. 用内存优化的hash表做mapjoin. 由于该类型hash表无法序列化到磁盘,只适用于TEZ和spark

    8.hive.mapjoin.optimized.hashtable.wbsize

        默认10485760(10M). 优化hash表使用链块内存缓存,可以优化数据较大的表加载,小表不适用,会浪费内存

    9.hive.map.groupby.sorted

        hive2.0之后默认true. 分桶表和排序表,若分组聚合的key值与分桶或排序的列一致,优化使用BucketizedHiveInputFormat

    10.hive.vectorized.execution.mapjoin.native.enabled

        默认false. 是否使用原生向量化执行模式执行mapjoin。比普通mapjoin快

    11.hive.vectorized.execution.mapjoin.minmax.enabled

        默认false. 是否使用vector mapjoin hash表,用于整型连接的最大值和最小值过滤

    reduce阶段 

    与mapper读取本地文件不同,reducer会去拉取远程map节点产生的数据,这里会涉及网络IO和磁盘IO。

    如非必须对数据全局处理如全局排序,关掉reduce阶段的操作就可以提升程序性能。

    1.mapred.reduce.tasks

        默认-1. 设置reducer的数量,-1代表系统根据需要自行决定reducer数量

    2.hive.exec.reducers.bytes.per.reducer

        hive0.14版本后默认256M. 设置每个reducer处理的数据量,若输入reduce数据量1G,那么会拆分为4个reducer任务(这应该是在map端无小文件的情况下吧

    3.hive.exec.reducers.max

        设置一个作业运行的最大reduce个数,默认值999

    4.hive.multigroupby.singlereducer

        如果一个SQL有多分组聚合操作,且分组使用相同的字段,那么这些分组聚合可以用一个作业的reduce完成,而不是分解成多个作业、多个reduce。可以减少作业重复读取和shuffle的操作

    5.hive.mapred.reduce.tasks.speculative.execution

        表示是否开启reduce任务推测执行。即系统在一个reduce任务中执行进度远低于其他任务的执行进度,会尝试在另外的机器上启动一个相同的reduce任务

    6.hive.optimize.reducededuplication

        当数据需要按相同的键再次聚合时,开启这个配置可以减少重复的聚合操作

    7.hive.vectorized.execution.reduce.enabled

        是否启用reduce任务的向量化执行,默认true。mapreduce计算引擎不支持reduce阶段向量化处理

    8.hive.vectorized.execution.reduce.groupby.enabled

        reduce任务分组聚合查询的向量化执行,默认true。mapreduce计算引擎不支持reduce阶段向量化处理

    shuffle阶段

     从mapper的map方法输出到reducer的reduce方法输入的整个过程

    mapreduce的map端聚合-combiner类

    combiner的逻辑可以直接使用reducer的逻辑,对本地的mapper任务做reducer程序逻辑,一般称为map端的reduce任务。可以减少shuffle过程的数据量,减轻系统的磁盘IO与网络IO

    1.hive.map.aggr

        默认true. 表示开启map端聚合。启用之后,会在map端多一个reduce操作,这是为了减少map任务的输出,减少传输到下游任务的shuffle数据量。但若数据经聚合后不能明显减少,那就会浪费机器的IO资源。所以这时引入两个参数hive.map.aggr.hash.min.reduction和hive.groupby.map.aggr.checkinterval用于控制何时开启聚合

    2.hive.map.aggr.hash.min.reduction

        是一个阈值,默认0.5

    3.hive.groupby.mapaggr.checkinterval

        默认100000. hive启用combiner会尝试取这个配置对应的数据量进行聚合,聚合后数据除以聚合前数据,若小于hive.mapaggr.hash.min.reduction会自动关闭(这里应该是大于??)

    4.hive.map.aggr.hash.min.percentmemory

        默认0.5. mapper端聚合占用的最大内存。若分配给该节点的最大堆为1024MB,那么聚合能使用hash表最大内存512MB

    5.hive.map.aggr.hash.force.flush.memory.threshold

        默认0.9. 该值表示当聚合占用hash表内存超0.9触发落磁盘,如hash表内存512MB,当hash表数据内存超461MB时触发hash表写入磁盘

    mapreduce作业输出

    1.开启中间作业文件压缩:

    hive.exec.compress.intermediate=true

    2.开启写入hive或hdfs文件压缩:

    hive.exec.compress.output=true

    要在mapreduce中起作用的前提是,还要设置:

    mapred.output.compression.codec; mapred.output.compression两个属性

    参考:

    set hive.exec.compress.intermediate=true;

    set mapreduce.map.output.compress=true;

    set hive.intermadiate.compression.code=org.apache.hadoop.io.compress.SnappyCodec;

    set hive.intermediate.compression.type=BLOCK;

    小文件压缩可以看:hive优化2-hive的Input阶段:inputsplit与map数量、小文件 

    mapreduce作业与hive配置

    1.hive.optimize.countdistinct

        默认true. 3.0新增配置项,优化去重计数作业,分成两个作业来处理,以达到减缓SQL数据倾斜作用

    2.并行:hive.exec.parallel=true;hive.exec.parallel.thread.num=8

        默认为False;8. 第一个参数是开启作业并行。如果一个SQL有两个阶段stage1、stage2, 没有直接以来的关系,开启该参数会以并行方式执行这两个阶段;第二个参数指一个作业最多允许8个作业同时执行

    3.hive.exec.mode.local.auto

        默认false, 是否开启本地执行模式,数据量较小的作业可以在单台机器上处理完所有任务,能有效节省时间。还需几个参数:hive.exec.mode.local.auto.inputbytes.max默认值134217728(128M),表示作业处理数据量小于该值,开启本地模式;hive.exec.mode.local.auto.tasks.max默认值为4,作业启动数目不大于该值,本地模式才生效,0.9版本之后该参数为:hive.exec.mode.local.auto.input.files.max

    4.hive.optimize.correlation

        默认false,相关性优化,配置可以减少重复的shuffle操作(在join和groupby的key值一样的情况下可以优化)

  • 相关阅读:
    解决easy ui 1.4datebox控件不能清空的问题
    easy ui 1.4的NumberBox,失去焦点后不能再次输入小数点
    使用easy ui过程中资料(网址)总结
    解决easy ui两次请求服务器的问题
    JQuery EasyUI中datagrid的使用
    java对象和xml相互转换
    mybatisPuls初步了解
    Spring Cloud Alibaba系列
    artemis.http.client1.2 导致springboot日志不输出
    当我们在谈论爬虫时我们在谈论什么(一)
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14155164.html
Copyright © 2020-2023  润新知