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);
}
即上面new TeraSort()对应下面的参数Tool tool,而下面方法return tool.run,也就是运行TeraSort得到其返回值,TeraSort运行完成返回1, 否则返回0,所以在完成时System.exit(res)退出。