设置队列
Hive中所有MapReduce作业都提交到队列queue1中,对本次启动的会话有效,下次启动需要重新配置
hive --hiveconf mapreduce.job.queuename=queue1
设置执行引擎
set hive.execution.engine=mr;
set hive.execution.engine=spark;
控制Hive中map的数量
hive.merge.mapfiles=true//合并map端输出的结果
mapreduce.map.memory.mb=8192 // 设置申请map资源 10G内存
mapreduce.map.cpu.vcores=1 //设置申请cpu资源(需要在Yarn配置)
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;执行Map前进行小文件合并
map数量由三个配置决定:
mapred.min.split.size.per.node, 一个节点上split的至少的大小
mapred.min.split.size.per.rack 一个交换机下split至少的大小
mapred.max.split.size 一个split最大的大小
主要是把输入目录下的大文件分成多个map的输入, 并合并小文件, 做为一个map的输入。
具体的原理是下述三步:
a、根据输入目录下的每个文件,如果其长度超过mapred.max.split.size,以block为单位分成多个split(一个split是一个map的输入),每个split的长度都大于mapred.max.split.size, 因为以block为单位, 因此也会大于blockSize, 此文件剩下的长度如果大于mapred.min.split.size.per.node, 则生成一个split, 否则先暂时保留.
b、现在剩下的都是一些长度效短的碎片,把每个rack下碎片合并, 只要长度超过mapred.max.split.size就合并成一个split, 最后如果剩下的碎片比mapred.min.split.size.per.rack大, 就合并成一个split, 否则暂时保留.
c、把不同rack下的碎片合并, 只要长度超过mapred.max.split.size就合并成一个split, 剩下的碎片无论长度, 合并成一个split
控制Hive中reduce数量
hive.merge.mapredfiles=true//合并reduce端输出的结果
mapred.reduce.tasks=3 (强制指定reduce的任务数量)
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认256000000)
hive.exec.reducers.max(每个任务最大的reduce数,默认为1009)
计算reducer数的公式很简单N=min( hive.exec.reducers.max ,总输入数据量/ hive.exec.reducers.bytes.per.reducer )
只有一个reduce的场景:
a、没有group by 的汇总
b、order by
c、笛卡尔积
数据倾斜
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce个数
set hive.groupby.mapaggr.checkinterval=