zoukankan      html  css  js  c++  java
  • Hive性能优化

    Hive优化的四种方式

    一、整体架构优化

    img

    整体架构优化点:

    • 根据不同业务需求进行日期分区, 并执行类型动态分区。
    hive.exec.dynamic.partition=true
    
    • 为了减少磁盘存储空间以及I/O次数, 对数据进行压缩(Gzip)
    mapreduce.output.fileoutputformat.compress=true
    mapreduce.output.fileoutputformat.compress.type=BLOCK
    mapreduce.output.fileoutputformat.compress.codec=org.apache.io.compress.GzipCodec
    
    mapreduce.map.output.compress=true
    mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec
    
    hive.exec.compress.output=true
    hive.exec.compress.intermediate=true
    
    • hive中间表以SequenceFile保存, 可以节约序列化和反序列化时间
    hive.query.result.fileformat=SequenceFile
    
    • yarn优化

      • 为了易于管理资源和调度资源,Hadoop YARN内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子,如果应用程序申请的资源量小于最小可申请资源量,则YARN会将其大小改为最小可申请量,也就是说,应用程序获得资源不会小于自己申请的资源,但也不一定相等 。

      • 如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功

      • 规整化因子是用来规整化应用程序资源的,应用程序申请的资源如果不是该因子的整数倍,则将被修改为最小的整数倍对应的值,公式为ceil(a/b)*b [a: 应用程序申请的资源, b: 规整化因子]

        yarn-site.xml中参数设置:

        # 最小可申请内存量, 默认是1024
        yarn.schedular.minimum-allocation-mb
        # 最小可申请CPU数, 默认为1
        yarn.schedular.minimum-allocation-vcores
        # 最大可申请内存量, 默认为8096
        yarn.schedular.maximum-allocation-mb
        # 最大可申请CPU数, 默认为4
        yarn.schedular.maximum-allocation-vcores
        

        规整化因子对于不同的调度器不同:

        • FIFO(First In First Out) 和 Capacity Scheduler

          • 规整化因子等于最小可申请资源量, 不可单独配置
        • Fair Scheduler(公平调度)

          • 规整化因子通过yarn.schedular.increment-allocation-mb和yarn.schedular.increment-allocation-vcores设置, 默认是1024和1。

    二、MapReduce阶段优化

    hive操作符:

    操作符(Operator) 描述(Description)
    TableScanOperator 扫描hive表数据
    ReduceSinkOperator 创建将发送到Reduce端的<key,reduce>对
    JoinOperator 合并两份数据
    SelectOperator 选择输出列
    FileSinkOperator 建立结果数据, 输出至文件
    FilterOperator 过滤输入数据
    GroupByOperator Group By分组语句
    MapJoinOperator /+mapjoin(t)/
    LimitOperator Limit语句
    UnionOperator Union语句

    执行流程:

    img

    reduce切割算法:

    hive.exec.reducers.max=999
    hive.exec.reducers.bytes.per.reducer=1G
    reduce task num=min{reducers.max,input.size/bytes.per.reducer}
    ##可以根据实际需求来调整reducer个数
    

    三 、Job优化

    • 本地执行
      • 默认关闭了本地执行模式, 小数据可以使用本地模式执行, 加快执行速度。
    hive.exec.mode.local.auto=true
    
    ##默认本地执行的条件:
    hive.exec.mode.local.auto.inputbytes.max=128MB
    hive.exec.mode.local.auto.tasks.max=4
    # reduce task最多一个
    
    • mapjoin

      • 默认mapjoin为打开的:

        hive.auto.convert.join.noconditionaltask.size=10MB
        
      • 装载到内存的表必须是通过scan的表(不包括group by等操作), 如果join的两个表都满足上面的条件, /mapjoin/指定表格不起作用, 只会装载小表到内存, 否则就会选哪个满足条件的scan表。

    四、SQL优化

    整体优化策略:

    • 去除查询中不需要的column
    • Where条件判断等在TableScan阶段就进行过滤
    • 利用Partition信息, 只读取符合条件的Partition
    • Map端join, 以大表作驱动, 小表载入所有mapper内存中
    • 调整Join顺序, 确保以大表作为驱动表
    • 对于数据分布不均匀的表Group by时, 为避免数据集中到少数的reducer上, 分成两个map-reduce阶段。第一个阶段先用Distinct列进行shuffle, 然后在reduce端部分聚合, 减小数据规模, 第二个阶段, 再按group-by列聚合。
    • 在map端用hash进行部分聚合, 减小reduce端数据处理规模。

    五、平台优化

    • hive on tez

    img

    • spark SQL(大趋势)

    img

  • 相关阅读:
    SystemTap
    在qemu上运行BusyBox
    Initramfs 原理和实践
    在qemu环境中用gdb调试Linux内核
    [转载] 你所不知道的TIME_WAIT和CLOSE_WAIT
    Linux VXLAN
    :not伪类选择器一些错误的写法
    c# 微软小冰-虚拟女友聊天
    Django使用表单操作数据库
    Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档
  • 原文地址:https://www.cnblogs.com/ronnieyuan/p/11587082.html
Copyright © 2011-2022 走看看