TeraSort源码包含很多个java文件,其中可以分为三个部分:TeraGen, TeraSort和TeraValidate。
TeraGen负责生成排序所需的随机数据,TeraValidate用来验证排序结果。
而与TeraSort排序相关的java文件有TeraSort.java, TeraInputFormat.java, TeraOutputFormat.java, TeraScheduler.java。
编译完源代码之后,设置运行参数,用TeraGen生成500M的数据,然后运行TeraSort(代码中添加Job.setNumReduceTasks(10),即设定Reduce Task的数量为10, 否则默认为1),会发现在进入Map阶段之前有下列几行输出,我就从这几句输出入手来学习这几个java文件。
Spent 251ms computing base-splits. (1)
Spent 27ms computing TeraScheduler splits. (2)
Computing input splits took 280ms (3)
Sampling 10 splits of 15 (4)
Making 10 from 100000 sampled records (5)
Computing parititions took 1216ms (6)
Spent 1534ms computing partitions. (7)
接下来就按照这几句输出的顺序看起,
先看TeraSort的main方法:
int res = ToolRunner.run(new Configuration(), new TeraSort(), args);
System.exit(res);
Ctrl点进run这个方法里面看到:
public static int run(Configuration conf, Tool tool, String[] args)
throws Exception{
if(conf == null) {
conf = new Configuration();
}
GenericOptionsParser parser = new GenericOptionsParser(conf, args);
//set the configuration back, so that Tool can configure itself
tool.setConf(conf);
//get the args w/o generic hadoop args
String[] toolArgs = parser.getRemainingArgs();
return tool.run(toolArgs);
}

本文详细介绍了Hadoop TeraSort的实现原理,包括TeraGen数据生成、TeraSort排序过程和TeraValidate验证。重点解析了TeraSort.java中的TeraScheduler调度优化,以及采样、分区和MapReduce阶段的流程。通过TeraInputFormat的writePartitionFile方法理解数据切片和采样策略,展示了如何通过TotalOrderPartitioner实现全局有序。实验数据显示,使用TotalOrderPartitioner能有效均衡Reduce Task的工作负载。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



