Hadoop教程

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作业的 输出而汇报出来。

我使用的集群如下:

  • 910个节点
  • 每个节点有2个2.0 Ghz的双核Xeon芯片
  • 每个节点有4个SATA硬盘
  • 每个节点有8 GB的RAM(随机访问内存)
  • 每个节点有1千兆比特的以太网
  • 每个机架上安放40个节点
  • 从每个机架到中心内核有8千兆比特的以太网上行连接
  • Red Hat Enterprise Linux Server 5.1 版(内核 2.6.18)
  • Sun Java JDK 1.6.0_05-bl3
  • 排序过程只花了 209秒(3.48分钟)。我运行的是Hadoop trunk(pre-0.18.0),使用的是为HADOOP-3443和HADOOP-3446编写的补丁,它要求最后从硬盘刪除所有的中间数据。尽管我有910个节点主要供我使用,但网络核心模块是与另外一个活 跃的有2000个节点的集群共享,因此运行时间会因为其他节点的活动而变化。

    关注微信获取最新动态