报错现象:
map阶段内存溢出
解决:增加map个数,设置参数set mapreduce.input.fileinputformat.split.maxsize=50000000;
优化目标:每个map和reduce需要处理适量的数据
从HDFS读取数据,第一步需要决定产品多少map,即并行度
影响map的因素:输入的文件的大小
对于map,默认的hive.input.format是org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
相关的参数控制mapred.min.split.size.per.node,mapred.min.split.size.per.rack,mapred.max.split.size
a、根据输入目录下的每个文件,根据mapred.max.split.size分成多个split(一个split是一个map的输入),此文件剩下的长度如果大于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.
减少map,则只需要调大mapred.max.split.size
或者
Hadoop中的参数:可以通过控制文件的数量控制mapper数量
mapreduce.input.fileinputformat.split.minsize(default:0),小于这个值会合并
mapreduce.input.fileinputformat.split.maxsize 大于这个值会切分
案例中通过减少mapreduce.input.fileinputformat.split.maxsize来增加文件数,从而增加map数量
reduce阶段
reduce数量由以下三个参数决定,
mapred.reduce.tasks(强制指定reduce的任务数量)
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
转载:
网友评论