Apache Hadoop的TB字节数量级排序
Apache Hadoop是一个开源软件框架,它显著简化了分布式数据密集型应用程序的 编写。它提供了一个基于Google File System(Google文件系统)的分布式文件系 统,它还提供了对MapReduce模型8的实现,用于管理分布式计算。因为 MapReduce模型的主要原语操作(primitive)是分布式排序,所以大部分自定义代码 都与获取期望的功能紧密相关。
我写了三个Hadoop应用来执行万亿字节数据排序。
1.TeraGen是一个用于产生数据的MapReduce程序。
2.TeraSort对输入数据取样,并用MapReduce模型对数据进行全序排列。
3.TeraValidate是一个用于验证输出有序性的MapReduce程序。
整个程序是大约1000行的Java代码,它将被放在Hadoop范例目录下。
TeraGen产生输出数据,它的代码和C语言版本是完全一样的,包括换行和特定 的键值定义。它根据预期的任务数把数据切分成期望的数据行数,并把数据行段分 配给每个map作业。map作业让随机数产生器产生第一行数据的正确值,然后产 生其他行的数据。
最终运行时,我为 TeraGen配置使用1800个任务在HDFS上产生总数达100亿行 的数据,HDFS上每个文件块的大小是512MB。
除了一个自定义的partitioner之外,TeraSort的其他部分都是一个标准的 MapReduce排序程序,这个partitioner使用了一个已经排序的N_1个取样的键 值,用这个列来定义每个reduce作业键的范围。值得一提的是,所有的键如 sample[i-\] <= key
图16-21.reduce作业输出数据的大小和作业结束时间的分布图
图16-22.整个运行时间内每个阶段的任务数
TeraValidate确保输出是全局排序的。它为输出文件目录中的每个文件新建一个 map作业,每个map作业确保每个键值都不大于前一个。这个map作业也产生每 个文件的第一个和最后一个键的记录,reduce作业确保文件i的第一个键值大于文 件i-1的最后一个键。如果出了问题,顺序错误的键值产生会作为reduce作业的 输出而汇报出来。
我使用的集群如下:
排序过程只花了 209秒(3.48分钟)。我运行的是Hadoop trunk(pre-0.18.0),使用的是为HADOOP-3443和HADOOP-3446编写的补丁,它要求最后从硬盘刪除所有的中间数据。尽管我有910个节点主要供我使用,但网络核心模块是与另外一个活 跃的有2000个节点的集群共享,因此运行时间会因为其他节点的活动而变化。