导航

Hive 优化

Posted on 2019-08-01 16:35  两张10元钱  阅读(133)  评论(0编辑  收藏  举报
  • 表之间的Join优化

  表之间的join分为Map-side JoinReduce-side Join

  Map-side Join(Broadcast join)

   Join操作在map task中完成,因此无需启动reduce task;

   适合一个大表,一个小表的连接操作

   思想:将小表复制到各个节点上,并加载到内存中;大表分片,与小表完成连接操作

  Reduce-side Join(shuffle join)

   Join操作在reduce task中完成;

   适合两个大表连接操作

   思想:map端按照字段进行hash,reduce端完成连接操作

  • Map-side Join控制参数

  在大部分情况如果可以使用MapJoin算法,尽量使用MapJoin算法,运行速度更快一些,那么如何控制MapJoin

  mapside join提示:

  /* +mapjoin(small_table)*/:small_table表示需要广播的小表

  如:select /* +mapjoin(user) */  列名 from 表名 join ……

  hive.ignore.mapjoin.hint

  自动转换mapside join

  hive.auto.convert.join:默认为true,自动会广播小表

  hive.mapjoin.smalltable.filesize;默认为25M,当表小于25M时会做广播,如果两个表都大于25M,不广播

  内存控制:

  hive.mapjoin.followby.gby.localtask.max.memory.usage;

  set hive.mapjoin.localtask.max.memory.usage;

  • MR阶段优化-Map阶段

  num_map_tasks切割大小影响参数,设置这两个参数,可控制maptask的数量

  mapreduce.input.fileinputformat.split.maxsize默认:INT-MAX

  mapreduce.input.fileinputformat.split.minsize默认:0

  dfs.block.size默认:128M

  • MR阶段优化-Reduce阶段

  mapreduce.job.reduces直接设置,设置为几个,启动的reduce就为几个,一般设置为-1,由hive自己判断启动多个个reduceTask

  num_reduce_tasks大小影响参数

  hive.exec.reducers.max默认:1099

  hive.exec.reducers.bytes.per.reducer默认:1G

  •  MR阶段优化-Shuffle阶段

  压缩中间数据;减少磁盘操作;减少网络传输数据量

  配置方法:

  mapreduce.map.output.compress设为true

  mapreduce.map.output.compress.codec:压缩编码方式

    org.apache.hadoop.io.compress.LzoCodec

    org.apache.hadoop.io.compress.SnappyCodec

  •  作业并发度设置

  hive.exec.parallel=true(默认: false)

    无依赖关系的job可并发执行(一个HQL可生成多个job)

  hive.exec.parallel.thread.number=8(默认: 8)最多可执行的线程数量