甘肃省住房和城乡建设部网站首页,免费空间 个人网站 google广告联盟,域名备案未做网站,重庆新闻频道1#xff09;数据输入#xff1a; 1#xff09;合并小文件#xff1a;在执行mr任务前将小文件进行合并#xff0c;大量的小文件会产生大量的map任务#xff0c;增大map任务装载次数#xff0c;而 任务的装载比较耗时#xff0c;从而导致 mr 运行较慢。 2#xff09;…1数据输入 1合并小文件在执行mr任务前将小文件进行合并大量的小文件会产生大量的map任务增大map任务装载次数而 任务的装载比较耗时从而导致 mr 运行较慢。 2采用ConbinFileInputFormat来作为输入解决输入端大量小文件场景。 2map阶段 1减少spill次数通过调整io.sort.mb及sort.spill.percent参数值增大触发spill的内存上限减少spill次数从而减少磁 盘 IO。 2减少merge次数通过调整io.sort.factor参数增大merge的文件数目减少merge的次数从而缩短mr处理时间。 3在 map 之后先进行combine处理减少 I/O。 3reduce阶段 1合理设置map和reduce数两个都不能设置太少也不能设置太多。太少会导致task等待延长处理时间太多 会导致 map、reduce任务间竞争资源造成处理超时等错误。 2设置map、reduce共存调整slowstart.completedmaps参数使map运行到一定程度后reduce也开始运行减少 reduce的等待时间。 3规避使用reduce因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。 4合理设置reduc端的buffer默认情况下数据达到一个阈值的时候buffer中的数据就会写入磁盘然后reduce会从 磁盘中获得所有的数据。也就是说buffer和reduce是没有直接关联的中间多个一个写磁盘-读磁盘的过程既然有这个弊端 那么就可以通过参数来配置使得buffer中的一部分数据可以直接输送到reduce从而减少IO开销 mapred.job.reduce.input.buffer.percent默认为0.0。当值大于0的时候会保留指定比例的内存读buffer中的数据直接拿给reduce 使用。这样一来设置buffer需要内存读取数据需要内存reduce计算也要内存所以要根据作业的运行情况进行调整。 4IO传输 1采用数据压缩的方式减少网络IO的的时间。 安装Snappy和LZOP压缩编码器。 2使用SequenceFile二进制文件 5数据倾斜问题 1数据倾斜现象 数据频率倾斜——某一个区域的数据量要远远大于其他区域。 数据大小倾斜——部分记录的大小远远大于平均值。 2如何收集倾斜数据 在reduce方法中加入记录map输出键的详细情况的功能。 public static final String MAX_VALUES skew.maxvalues;
private int maxValueThreshold;
Override
public void configure(JobConf job) { maxValueThreshold job.getInt(MAX_VALUES, 100);
} Override
public void reduce(Text key, IteratorText values,
OutputCollectorText, Text output,
Reporter reporter) throws IOException {int i 0;
while (values.hasNext()) {values.next();
i;
}if (i maxValueThreshold) {log.info(Received i values for key key);}
} 3减少数据倾斜的方法 方法1抽样和范围分区 可以通过对原始数据进行抽样得到的结果集来预设分区边界值。 方法2自定义分区 另一个抽样和范围分区的替代方案是基于输出键的背景知识进行自定义分区。例如如果map输出键的单词来源于一本书。 其中大部分必然是省略词stopword。那么就可以将自定义分区将这部分省略词发送给固定的一部分reduce实例。而将其他的 都发送给剩余的reduce例。 方法3Combine 使用Combine可以大量地减小数据频率倾斜和数据大小倾斜。在可能的情况下combine的目的就 是聚合并精简数据。 结语小编能力有限 欢迎大家多多指教