你好,游客 登录
背景:
阅读新闻

Hadoop平台上的海量数据排序(1)

[日期:2014-09-18] 来源:机械工业出版社  作者: 陆嘉恒 [字体: ]

      Yahoo!研究人员使用hadoop完成了Jim Gray基准排序,此排序包含许多相关的基准,每个基准都有自己的规则。所有的排序基准都是通过测量不同记录的排序时间来制定的,每个记录为100字节, 其中前面的10字节是键,剩余的部分是数值。MinuteSort是比较在一分钟内所排序的数据量大小,GraySort是比较在对大规模数据(至少 100TB)进行排序时的排序速率(TBs/minute)。基准规则具体如下:

      输入数据必须与数据生成器生成的数据完全匹配;

      任务开始的时候,输入数据不能在操作系统的文件缓存中。在Linux环境下,排序程序之间需要使用内存来交换其他内容;

      输入和输出数据都是没有经过压缩的;

      输出不能对输入进行重写;

      输出文件必须存放到磁盘上;

      必须计算输入和输出数据的每个键/值对的CRC32,共128位校验和,当然,输入和输出必须对应相等;

      输出如果分成多个输出文件,那么必须是完全有序的,也就是将这些输出文件连接以后必须是完全有序的输出;

      开始和分布程序到集群上也要记入计算时间内;

      任何抽样也要记入计算时间内。

      Yahoo!的研究人员使用Hadoop排列1TB数据用时62秒,排列1PB数据用时16.25个小时,具体如表3-2所示,它获得了Daytona类GraySort和MinuteSort级别的冠军。

表3-2 数据规模与排序时间

 

 

      下面的内容是根据基准排序的官方网站(http://sortbenchmark.org/)上有关使用Hadoop排序的相关内容整理而成。

      Yahoo!的研究人员编写了三个Hadoop应用程序来进行TB级数据的排序:

      TeraGen产生数据的map/reduce程序;

      TeraSort进行数据取样,并使用map/reduce对数据进行排序;

      TeraValidate是用来验证输出数据是否有序的map/reduce程序。

      TeraGen用来产生数据,它将数据按行排列并且根据执行任务的数目为每个map分配任务,每个map任务产生所分配行数范围内的数据。最后,TeraGen使用1800个任务产生总共100亿行的数据存储在HDFS上,每个存储块的大小为512MB。

      TeraSort是标准的map/reduce排序程序,但这里使用的是不同的分配方法。程序中使用N-1个已排好序的抽样键值来为reduce任 务分配排序数据的行数范围。例如,键值key在范围sample[i-1]<=key<sample[i]的数据会分配给第i个reduce 任务。这样就保证了第i个reduce任务输出的数据都比第i+1个reduce任务输出的数据小。为了加速分配过程,分配器在抽样键值上建立两层的索引 结构树。TeraSort在任务提交之前在输入数据中进行抽样,并将产生的抽样数据写入HDFS中。这里规定了输入输出格式,使得三个应用程序可以正确地 读取并写入数据。reduce任务的副本数默认是3,这里设置为1,因为输出数据不需要复制到多个节点上。这里配置的任务为1800个map任务和 1800个reduce任务,并为任务的栈设置了充足的空间,防止产生的中间数据溢出到磁盘上。抽样器使用100 000个键值来决定reduce任务的边界,如图3-9所示,分布并不是很完美。

      TeraValidate保证输出数据是全部排好序的,它为输出目录的每个文件分配一个map任务(如图3-10所示),map任务检查每个值是否 大于等于前一个值,同时输出最大值和最小值给reduce任务,reduce任务检查第i个文件的最小值是否大于第i-1文件的最大值,如果不是则产生错 误报告。

 
图3-9 reduce任务的输出大小和完成时间分布图


      以上应用程序运行在雅虎搭建的集群上,其集群配置为:

      910个节点;

      每个节点拥有4个英特尔双核2.0GHz至强处理器;

      每个节点拥有4个SATA硬盘;

      每个节点有8GB的内存;

      每个节点有1GB的以太网带宽;

      40个节点一个rack;

      每个rack到核心有8GB的以太网带宽;

      操作系统为Red Hat Enterprise Linux Server Release 5.1(kernel 2.6.18);

      JDK为Sun Java JDK 1.6.0_05-b13。

      整个排序过程在209秒(3.48分钟)内完成,尽管拥有910个节点,但是网络核心是与其他2000个节点的集群共享的,所以运行时间会因为其他集群的活动而有所变化。





收藏 推荐 打印 | 录入: | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款