zoukankan      html  css  js  c++  java
  • hive优化要点总结

    个人认为总体两种思想

    1、让服务器尽可能的多做事情,榨干服务器资源,以最高系统吞吐量为目标

    再好的硬件没有充分利用起来,都是白扯淡。

    比如:

    (1)  启动一次job尽可能的多做事情,一个job能完成的事情,不要两个job来做

     通常来说前面的任务启动可以稍带一起做的事情就一起做了,以便后续的多个任务重用,与此紧密相连的是模型设计,好的模型特别重要.

    (2) 合理设置reduce个数

    reduce个数过少没有真正发挥hadoop并行计算的威力,但reduce个数过多,会造成大量小文件问题,数据量、资源情况只有自己最清楚,找到个折衷点,

    (3) 使用hive.exec.parallel参数控制在同一个sql中的不同的job是否可以同时运行,提高作业的并发

    2、让服务器尽量少做事情,走最优的路径,以资源消耗最少为目标

     比如:

    (1) 注意join的使用

    若其中有一个表很小使用map join,否则使用普通的reduce join,注意hive会将join前面的表数据装载内存,所以较小的一个表在较大的表之前,减少内存资源的消耗

    (2)注意小文件的问题

    在hive里有两种比较常见的处理办法

    第一是使用Combinefileinputformat,将多个小文件打包作为一个整体的inputsplit,减少map任务数

    set mapred.max.split.size=256000000;

    set mapred.min.split.size.per.node=256000000

    set  Mapred.min.split.size.per.rack=256000000

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

    第二是设置hive参数,将额外启动一个MR Job打包小文件

    hive.merge.mapredfiles = false 是否合并 Reduce 输出文件,默认为 False 

     hive.merge.size.per.task = 256*1000*1000 合并文件的大小 

    (3)注意数据倾斜

    在hive里比较常用的处理办法

    第一通过hive.groupby.skewindata=true控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题

    第二通过hive.map.aggr = true(默认为true)在Map端做combiner,假如map各条数据基本上不一样, 聚合没什么意义,做combiner反而画蛇添足,hive里也考虑的比较周到通过参数hive.groupby.mapaggr.checkinterval = 100000 (默认)hive.map.aggr.hash.min.reduction=0.5(默认),预先取100000条数据聚合,如果聚合后的条数/100000>0.5,则不再聚合

    (4)善用multi insert,union all

    multi insert适合基于同一个源表按照不同逻辑不同粒度处理插入不同表的场景,做到只需要扫描源表一次,job个数不变,减少源表扫描次数

    union all用好,可减少表的扫描次数,减少job的个数,通常预先按不同逻辑不同条件生成的查询union all后,再统一group by计算,不同表的union all相当于multiple inputs,同一个表的union all,相当map一次输出多条

    (5) 参数设置的调优

    集群参数种类繁多,举个例子比如

    可针对特定job设置特定参数,比如jvm重用,reduce copy线程数量设置(适合map较快,输出量较大)

    如果任务数多且小,比如在一分钟之内完成,减少task数量以减少任务初始化的消耗。可以通过配置JVM重用选项减少task的消耗

  • 相关阅读:
    关于SQLServer数据库中字段值为NULL,取出来该字段放在DataTable中,判断datatable中该字段值是否为NULL的三种方法
    关于web程序中使用KindEditor向数据库插入带有格式的数据时出现的问题
    使用再生龙对ubuntu16.04系统完全备份与还原
    mysql数据库操作指令汇总
    ubuntu安装supervisor以及使用supervisor启动.net core进程
    c#小数取整
    nuget.server搭建及实际测试
    mysql主从同步+mycat读写分离+.NET程序连接mycat代理
    EasyNVR-流媒体服务详解
    Js实现子窗体给父窗体的元素赋值
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3343548.html
Copyright © 2011-2022 走看看