Hive优化(再一遍系统复习)

Hive优化(或者面试问你工作中遇到的问题就可以答hive优化)

  1. select * 是不走MR程序的
  2. 可以开启本地模式local(当文件小于默认128M且文件数少于4个,不走MR)
  3. 表的优化
    (1) 小表 join 大表
    将key相对分散,并且数据量小的表放在jon左边,这样可以有效减少内存溢出(OOM)错误发生几率;在进一步可以开启MapJoin让小维度的表先进入内存,在map端完成reduce(注:现在用的hive版本本身已经进行了优化,所以小表放在前或者后没有明显区别)
    (2)大表 Join 大表
    1.空key过滤(一般数据清洗已经被过滤掉了,脏数据需要进行过滤)
    2.空key转换
    有时某个key为空,但是并不是异常数据,此时可以给空key字段赋一个随机值,使数据随机均匀地分布在reduce上(要不然空key数据会都被分配到一个reduce里,造成数据倾斜)
  4. MapJoin(默认是开启的)(小表join大表时使用,可以有效提高效率)
    内存足够大可以把阈值调大(默认25M以下认为是小表)
    set hive.mapjoin.smalltable.filesize = ?;
    MapJoin工作机制:join机制在map阶段完成,把小表全部加载到内存在map端进行join,避免reduce处理。
  5. Group By
    (1) (默认情况,map阶段同一key数据分发给一个reduce,当一个key数据过大时就会发生数据倾斜)
    (2) 并不是聚合操作都要在reduce完成,也可以开启map端进行预聚合(combiner)(默认是开启的)
    (3)在发现有数据倾斜的时候可以打开负载均衡(默认是false)
    hive.groupby.skewindata = true;(确定存在数据倾斜时打开)
    开启后会生出两个MRJob,第一个job中,map的输出结果会随机分布到reduce中,每个reduce做部分聚合,并输出结果;第二个Job再根据预处理的结果按照group by key分布到reduce中,最后完成最终聚合。
  6. count(distinct) 去重统计(尽量不用,用groupby来代替)
    先group by 再count,避免oom或者数据倾斜
    只有一个reducer在进行count(distinct)的计算
  7. 尽量避免使用笛卡尔积,join的时候不加on条件或者无效on,hive只能使用1个reduce来完成笛卡尔积(生产环境中会关闭掉笛卡尔积 [会设置成严格模式])
  8. 行列过滤
    (1)列处理:少用select *
    (2)行处理:当使用外关联时,如果将副表过滤,条件写在where后面,那么就会全表关联,之后在过滤,那么副表就要先子查询在进行join。
  9. 动态分区调整(根据分区字段进行分区):需要配置参数,最大分区数、每个reduce分区数等参数。根据字段的不同个数来进行设定,每个reduce分区数少于不同字段个数会报错。
    10.MR优化
    (1)合理设置map数
    (2)合理设置reduce数
    (3)并行执行
    设置参数hive.exec.parallel = true;
    hive会将一个查询转换成一个或多个阶段,阶段可以是MR、抽样阶段、合并阶段、limit阶段。多个阶段并行度越高,job完成越快。
    (4)严格模式(严格模式下,笛卡尔积不被允许,分区表未指定分区不被允许等),在生成环境中是开启的,默认是false。
发布了83 篇原创文章 · 获赞 61 · 访问量 9183

猜你喜欢

转载自blog.csdn.net/weixin_43736084/article/details/103734015