整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

16.6 Apache Hadoop上万亿数量级排序

hadoop 花牛 17℃ 0评论

        这篇文章来自 印它写于 2008 年 月。每年,Jim Gray和他的后继者定义一系列的benchmark (基准测试程序用以发现最快的排序程序。几年来,万亿字节排序(TB Sort)和其他排序的 benchmarks 及其获胜者在 http://sortbenchmark.org/YahooHadoop.pdf网站列出。2009 年 4月,Arun Murthy和我在每分钟排序(目标是在一分钟之内排序尽可能多的 数据)的竞争中获胜,我们在1406Hadoop节点上于59秒之内完成了对 500 GB数据的排序工作。在同一个集群上我们也对1TB的数据进行了排序,花了 62秒的时间。2009年,我们使用的集群和下面列出的硬件配置相 似,不同的是网络较好,与前一年相比,我们机架间的超载比由5: 1变成 了 2 : 1。我们对节点之间产生的中间数据也采用了 LZO压缩方法。我们在 3658个节点上在975分钟之内完成了对1PB数据的排序,平均速度达 到每分钟排序1.03 TB数据。

Apache Hadoop是一个开源软件框架,它显著简化了分布式数据密集型应用 程序的编写。它提供了一个基于Google File System l;(Google文件系统)的分 布式文件系统,它还提供了对MapReduce模型®的实现,用于管理分布式 计算。因为MapReduce模型的主要原语操作是分布式排序,所以大部分自 定义代码能实现期望的功能。 

我写了三个Hadoop应用来执行万亿字节数据排序。

(1)TeraGen是一个用于产生数据的MapReduce程序。

(2)TeraSort对输入数据取样,并用MapReduce模型对数据进行全序

排列。

(3)TeraValidate是一个用于验证输出有序性的MapReduce程序。

整个程序是大约1000行的Java代码,它将被放在Hadoop范例目录下。

TeraGen产生输出数据,它的代码和C语言版本是完全样的,包括换行 和特定的键值定义。它根据预期的任务数把数据分成期望的数据行数,并 把数据行段分配给每个map作业。map作业让随机数产生器产生第一行数据的正确值,然后产生其他行的数据。最终运行时,我为TeraGen配置使 用1800个任务在HDFS上产生总数达100亿行的数据,HDFS上每个存储 文件块的大小是512 MB

除了一个自定义的数据切分程序之外,TepaSort是个标准的MapReduce 排序程序,这个数据切分程序使用了 一个已经排序的个取样的键值, 用这些排序好的键值来定义每个reduce作业键的范围。所以,所有的键如

sample[i-1] <=key<都被发送到 reduce /。这就保证,reduce / 的输

出都比reduce/+1的值小。为了sample[i]加速数据切分过程,这个数据切分程序构建 了基干键的前两个字节的两层字典树(two-level trie)索引,它可以帮助快速 地对取样的键建立索引。TeraSort在作业被提交之前通过对输入数据取样 并把样本键列表写入HDFS来获得样本键。

我写了一个输入和输出格式供三个应用程序共同使用,它负责以正确格式 读写文本文件。因为竞赛没有要求输出文件需要在多个节点上备份,所以 我们为reduce作业输出设置的副本数是1而不是默认的3。为该作业配置 使用了 1800 个 map1800 个 reduce,并设置 io.sort.mbio.sort.factor 参数、fs.inmemory.size.mb参数来保证足够大的任务堆内存,这可以确 保直到map结束都不用把中间数据写入硬盘。取样程序使用了 10万个键来 生成每个reduce的处理范围,然而从图16-21可以看出,受益于更多的取 样,各个reduce作业的数据分布愈加完美。在图16-22中,可以看到在作 业执行期间运行的任务的分布情况。

image.png

图16-21. reduce作业输出数据的大小和作业结束时间的分布图

TeraValidate确保输出是全局排序数据。它为输出文件目录中的每个文件 新建一个map作业,每个map作业确保每个键值都不大于前一个。这个 map作业也产生每个文件的第一个和最后一个键对应的记录,reduce作业 确保文件i的第一个键值大于文件卜1的最后一个键。如果键值没有排序好,错误信息作为reduce作业的输出而汇报出来。

 image.png

图16-22 整个运行时间内每个阶段的任务数分布

我使用的集群如下:

    910个节点

    •每个节点有22.0Ghz的双核Xeon芯片

    •每个节点有4SATA硬盘 

    •每个节点有8 GBRAM

    •每个节点有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个节点的集群共享网络核心模块,因此运 行时间会因为其他节点执行的操作而变化。

转载请注明:全栈大数据 » 16.6 Apache Hadoop上万亿数量级排序

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址