分类: 云计算
2011-10-23 22:21:12
Yahoo!研究人员使用Hadoop完成了Jim Gray基准排序,此排序包含许多相关的基准,每个基准都有自己的规则。所有的排序基准都是通过测量不同记录的排序时间来制定的,每个记录为100字节,其中前面的10字节是键,剩余的部分是数值。MinuteSort是比较在一分钟内所排序的数据量大小,GraySort是比较在对大规模数据(至少100TB)进行排序时的排序速率(TBs/minute)。基准规则具体如下:
Yahoo!的研究人员使用Hadoop排列1TB数据用时62秒,排列1PB数据用时16.25个小时,具体如表3-2所示,它获得了Daytona类GraySort和MinuteSort级别的冠军。
表3-2 数据规模与排序时间
数据大小(Bytes) | 节 点 数 | 副 本 数 | 时 间 |
500 000 000 000 | 1406 | 1 | 59秒 |
1 000 000 000 000 | 1460 | 1 | 62秒 |
100 000 000 000 000 | 3452 | 2 | 173分钟 |
1 000 000 000 000 000 | 3658 | 2 | 975分钟 |
下面的内容是根据基准排序的官方网站()上有关使用Hadoop排序的相关内容整理而成。
TeraGen用来产生数据,它将数据按行排列并且根据执行任务的数目为每个map分配任务,每个map任务产生所分配行数范围内的数据。最后,TeraGen使用1800个任务产生总共100亿行的数据存储在HDFS上,每个存储块的大小为512MB。
TeraSort是标准的map/reduce排序程序,但这里使用的是不同的分配方法。程序中使用N-1个已排好序的抽样键值来为reduce任务分配排序数据的行数范围。例如,键值key在范围sample[i-1]<=key
TeraValidate保证输出数据是全部排好序的,它为输出目录的每个文件分配一个map任务(如图3-10所示),map任务检查每个值是否大于等于前一个值,同时输出最大值和最小值给reduce任务,reduce任务检查第i个文件的最小值是否大于第i-1文件的最大值,如果不是则产生错误报告。
图3-9 reduce任务的输出大小和完成时间分布图
以上应用程序运行在雅虎搭建的集群上,其集群配置为:
整个排序过程在209秒(3.48分钟)内完成,尽管拥有910个节点,但是网络核心是与其他2000个节点的集群共享的,所以运行时间会因为其他集群的活动而有所变化。
使用Hadoop进行 GraySort基准排序时,Yahoo!的研究人员将上面的map/reduce应用程序稍加修改以适应新的规则,整个程序分为4个部分,分别为:
TeraGen和TeraSort与上面介绍的一样,TeraValidate除了增加了计算输出目录校验和总和的任务以外,其他都一样,这里不再赘述。
TeraSum计算每个键/值对的CRC32的校验和,每个map任务计算输入的校验和并输出,然后一个reduce任务将每个map生成的校验和相加。这个程序用来计算输入目录下每个键/值对校验和的和,还用来检查排序输出后的正确性。
图3-10 每个阶段的任务数
这次基准测试运行在Yahoo!的Hammer集群上,集群的具体细节如下:
对于较大规模的排序,这里NameNode和JobTracker使用的是64位的JVM。排序测试所用的Hadoop平台也做了一些变化,主要有:
Hadoop与上面的测试相比有了很大的改进,可以在更短的时间内执行更多的任务。值得注意的是,在大集群和分布式应用程序中需要转移大量数据,这会导致执行时间有很大的变化。但是随着Hadoop的改进,它能够更好地处理硬件故障,这种时间变化也就微不足道了。不同规模的数据排序所需的时间如表3-2所示。
因为较小规模的数据需要更短的延迟和更快的网络,所以使用集群中的部分节点来进行计算。将较小规模计算的输出副本数设置为1,因为整个过程较短且运行在较小的集群上,节点坏掉的可能性相对较小。而在较大规模的计算上,节点坏掉是难免的,于是将节点副本数设置为2。HDFS保证节点换掉后数据不会丢失,因为不同的副本放在不同的节点上。
Yahoo!的研究人员统计了JobTracker上从任务提交状况获得的任务数随时间的变化,图3-11、图3-12、图3-13、图3-14显示了每个时间点下的任务数。maps只有一个阶段,而reduces拥有三个阶段:shuffle、merge和reduce。shuffle是从maps中转移数据的,merge在测试中并不需要;reduce阶段进行最后的聚集并写到HDFS上。如果将这些图与图3-6进行比较,你会发现建立任务的速度变快了。图3-6中每次心跳建立一个任务,那么所有任务建立起来需要40秒,现在Hadoop每次心跳可以设置好一个TaskTracker,可见减少任务建立的开销是非常重要的。
图3-11 数据量为500GB时任务数随时间的变化
图3-12 数据量为1TB时任务数随时间的变化
图3-13 数据量为100TB时任务数随时间的变化
图3-14 数据量为1PB时任务数随时间的变化
运行大规模数据时,数据传输的次数对任务性能的影响也是非常大的。在PB级数据排序中,每个map处理15GB的数据而不是默认的128MB,每个reduce处理50GB的数据。如果按照1.5GB/map进行处理,需要 40个小时才能完成。因此,为了增加吞吐量,增加每个块的大小是非常重要的。
----------------------------------
本文节选自《Hadoop实战》第3章 3.5节“Hadoop平台上的海量数据排序”
作者:陆嘉恒
样张试读下载
访问本书官网