开启mapjoin

  1. set hive.auto.convert.join = true ; // mapJoin优化是否自动启动
  2. set hive.mapjoin.smalltable.filesize = 25000000; //广播小表的最大数据量字节数150M

mapjoin是由两个参数控制的:

  • mapJoin优化是否自动启动;
  • 如果在启动的情况下,小表数据量在多少M以内会进行广播

为什么系统自动设置为<150M?
历史原因:
大数据—>集群—>每台机器不是特别好—>基于当前的硬件环境,经过测试得出参数值—>随着硬件的发展—->人为调整参数值
spark —- 这几年产生的框架,默认参数是符合当前硬件环境的,大多数默认参数可以用
hadoop, hive —- 基于以前历史硬件环境设置的参数,在开发hadoop,hive时,一般要做参数优化,让程序能默认参数能够符合当前的硬件环境

mapTask并行度

  1. dfs.block.size = 128M ;
  2. mapreduce.input.fileinputformat.split.minsize = 1 ;
  3. mapreduce.input.fileinputformat.split.maxsize = Long.MAX_VALUE ;
  4. long splitSize = Math.max(minsize,Math.min(maxsize,blockSize));

—-> = blockSize = 128M
MapTask的并行度由block个数决定:
问 :因为需求的原因,每个mapTask执行128M数据延迟还是比较高,怎么解决?
让每个mapTask处理更少的数据;
把 splitSize 参数调整成64M,一个128M block 不会被切分成2个block块,但会有两个mapTask
mapTask1:从0字节开始到64M字节结束;
mapTask2:从64M字节开始到128M字节结束; (一个节点里面可以有多个mapTask同时执)
mapTask是一个Java程序,可设置jvm重用:set mapred.job.reuse.jvm.num.tasks = 5 ;
(mapTask,reduceTask可以运行在一个节点里)

小文件合并

程序为什么执行缓慢?

  1. 资源不断的申请和释放 —-申请资源需要时间,浪费资源还浪费时间
  2. 数据倾斜

优化:

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

//在mapTask执行前(逻辑型)合并小文件

  • set hive.merge.mapfiles = true;

//map端结束后合并小文件

  • set hive.merge.mapredfiles = false;

//mapReduce结束后作合并,减少小文件产生

  • set hive.merge.size.per.task = 256*1000*1000;

//合并文件大小

reduceTask的个数会决定程序执行效率

  • set mapreduce.job.reduces = 值; //设置reduceTask的个数(0.95 * datanode个数)

    Combiner操作是可选的

  • set hive.map.aggr = true ; //是否在map端进行局部聚合

  • set hive.groupby.mapaggr.checkinterval = 10000; //Map端聚合数据的条目个数

    提高并行度

    (maptask,reducetask)

  • set hive.exec.parallel = true;

  • set hive.exec.parallel.thread.number = 8; //同一个sql语句允许最大的并行任务数