- 浏览: 162211 次
- 来自: ...
文章分类
- 全部博客 (151)
- Liferay.in.Action (3)
- 集群 (12)
- web (5)
- jna (2)
- 数据库 (7)
- Terracotta (11)
- xml (1)
- Hibernate (3)
- Jdbc (2)
- DDD (10)
- nosql (7)
- 云存储 (3)
- 云产品 (7)
- 云计算 (26)
- Hadoop (11)
- 虚拟化 (5)
- REST (3)
- 程序人生 (11)
- google (2)
- 安全应用 (5)
- LDAP (0)
- 安全技术 (5)
- android (4)
- 网络妙语 (1)
- HTML5 (1)
- 搜索引擎 (1)
- 架构设计 (5)
- redis (3)
- Cassandra (2)
最新评论
-
liwanfeng:
情况是这样的,你的文件我觉得还是比较小,我现在需要处理的XML ...
dom4j处理大文件
作者 yunsamzhang
1、1TB(或1分钟)排序的冠军
作为分布式数据处理的框架,集群的数据处理能力究竟有多快?或许1TB排序可以作为衡量的标准之一。
1TB排序,就是对1TB(1024GB,大约100亿行数据)的数据进行排序。2008年,Hadoop赢得1TB排序基准评估第一名,排序1TB数据耗时209秒。后来,1TB排序被1分钟排序所取代,1分钟排序指的是在一分钟内尽可能多的排序。2009年,在一个1406个节点组成的hadoop集群,在59秒里对500GB完成了排序;而在1460个节点的集群,排序1TB数据只花了62秒。
这么惊人的数据处理能力,是不是让你印象深刻呢?呵呵
下面我们来看看排序的过程吧。
2、排序的过程
1TB的数据?100亿条数据?都是什么样的数据呢?让我们来看几条:
- .t^#\|v$2\ 0AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHH
- 75@~?'WdUF 1IIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPP
- w[o||:N&H, 2QQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXX
- ^Eu)<n#kdP 3YYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFF
- +l-$$OE/ZH 4GGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNN
- LsS8)|.ZLD 5OOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVV
- le5awB.$sm 6WWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDD
- q__[fwhKFg 7EEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLL
- ;L+!2rT~hd 8MMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTT
- M^*dDE;6^< 9UUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBB
.t^#\|v$2\ 0AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHH 75@~?'WdUF 1IIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPP w[o||:N&H, 2QQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXX ^Eu)<n#kdP 3YYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFF +l-$$OE/ZH 4GGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNN LsS8)|.ZLD 5OOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVV le5awB.$sm 6WWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDD q__[fwhKFg 7EEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLL ;L+!2rT~hd 8MMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTT M^*dDE;6^< 9UUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBB
描述一下:每一行,是一条数据。每一条,由2部分组成,前面是一个由10个随即字符组成的key,后面是一个80个字符组成的value。
排序的任务:按照key的顺序排。
那么1TB的数据从何而来?答案是用程序随即生成的,用一个只有map,没有reduce的MapReduce job,在整个集群上先随即生成100亿行数据。然后,在这个基础上,再运行排序的MapReduce job,以测试集群排序性能。
3、排序的原理
先说明一点,熟悉MapReduce的人都知道:排序是MapReduce的天然特性!在数据达到reducer之前,mapreduce框架已经对这些数据按键排序了。
所以,在这个排序的job里,不需要特殊的Mapper和Reducer类。用默认的
IdentityMapper和IdentityReducer即可。
既然排序是天然特性,那么1TB排序的难点在哪里呢??答:100亿行的数据随即分散在1000多台机器上,mapper和reducer都是Identity的,这个难点就在MapReduce的shuffle阶段!关键在如何取样和怎么写Partitioner。
好在这个排序的源代码已近包含在hadoop的examples里了,下面我们就来分析一下。
4、取样和partition的过程
面对对这么大量的数据,为了partition的更均匀。要先“取样”:
1) 对Math.min(10, splits.length)个split(输入分片)进行随机取样,对每个split取10000个样,总共10万个样
2) 10万个样排序,根据reducer的数量(n),取出间隔平均的n-1个样
3) 将这个n-1个样写入partitionFile(_partition.lst,是一个SequenceFile),key是取的样,值是nullValue
4) 将partitionFile写入DistributedCache
接下来,正式开始执行MapReduce job:
5) 每个map节点:
a.根据n-1个样,build一棵类似于B-数的“索引树”:
* 每个非叶子节点,都有256个子节点。
* 不算根节点的非叶子节点有1层,加上根节点和叶子节点,共3层。
* 非叶子节点代表key的“byte path”
* 每个叶子节点代表key的前2个bytes path
* 叶子节点上,保存的是partition number的范围,有多少个reducer就有多少partition number
b.前缀相同的key,被分配到同一个叶子节点。
c.一个子节点上,可能有多个reducer
d.比第i个样小的key,被分配到第i个reducer,剩下的被分配到最后一个reducer。
6) 针对一个key,partition的过程:
a. 首选判断key的第1个byte,找到第1层非叶子节点
b. 再根据key的第2个byte,叶子节点
c. 每个叶子节点可能对应多个取样(即多个reducer),再逐个和每个样比较,确定分配给哪一个reducer
5、图解partition的“索引树”
对上面的文字描述可能比较难理解,etongg 同学建议我画个图。所有才有了下面这些文字。感谢etongg和大家对本帖的关注。
“索引树”的作用是为了让key快速找到对应的reducer。下图是我画的索引树示意图:
对上面的图做一点解释:
1、为了简单,我只画了A、B、C三个节点,实际的是有256个节点的。
2、这个图假设有20个reducer(下标0到19),那么我们最终获得n-1个样,即19个样(下标为18的为最后一个样)
3、图中的圆圈,代表索引树上的节点,索引树共3层。
4、叶子节点下面的长方形代表取样数组。红色的数字代表取样的下标。
5、每个节点都对应取样数组上的一个下标范围(更准备的说,是对应一个partition number的范围,每个partition number代表一个reducer)。这个范围在途中用蓝色的文字标识。
前面文中有一句话:
比第i个样小的key,被分配到第i个reducer,剩下的被分配到最后一个reducer
这里做一个小小的纠正,应该是:
小于或者等于第i个样的key,被分配到第i个reducer,剩下的被分配到最后一个reducer。
下面开始partition:
如果key以"AAA"开头,被分配到第“0”个reducer。
如果key以"ACA"开头,被分配到第“4”个reducer。
如果key以"ACD"开头,被分配到第“4”个reducer。
如果key以"ACF"开头,被分配到第“5”个reducer。
那么,
如果key以"ACZ"开头,被分配到第几个reducer??
答案是:被分配到第“6”个reducer。
同理,
如果key以"CCZ"开头,被分配到第“19”个reducer,也就是最后一个reducer。
6、为什么不用HashPartitioner?
还需要再说明的一点:
上面自定义的Partitinoner的作用除了快速找到key对应的reducer,更重要的一点是:这个Partitioner控制了排序的总体有序!
上文中提到的“排序是MapReduce的天然特性!”这句话有点迷惑性。更准确的说,这个“天然特性”只保证了:a) 每个map的输出结果是有序的; b) 每个reduce的输入是有序的(参考下面的图)。而1TB的整体有序还需要靠Partitioner的帮助!
Partitioner控制了相似的key(即前缀相同)落在同一个reducer里,然后mapreduce的“天然特性”再保证每个reducer的输入(在正式执行reduce函数前,有一个排序的动作)是有序的!
这样就理解了为什么不能用HashPartitioiner了。因为自定义的Partitioner要保证排序的“整体有序”大方向。
另外,推荐一篇关于partitioner博文:Hadoop Tutorial Series, Issue #2: Getting Started With (Customized) Partitioning
再贴《Hadoop.The.Definitive.Guide》中一张图,更有利于理解了:
*** THE END ***
发表评论
-
Hadoop学习笔记之在Eclipse中远程调试Hadoop+0700错误的处理
2012-08-01 00:15 0原文 http://www.blogjava.net/y ... -
数据网格 Data Grid和NoSQL相同和区别-异同
2012-07-31 15:21 0原文 http://www.jdon.com/4372 ... -
Google在新的内容索引系统中放弃MapReduce
2012-07-31 10:30 879原文 http://www.hadoopor.co ... -
微软展开“大数据”蓝图,推进Hadoop至Azure和Windows Server
2012-07-31 10:13 931原文 http://www.iteye.com/news/23 ... -
Hadoop分布式文件系统:架构和设计要点
2012-07-31 10:07 811摘自 http://www.blogjava.net/ ... -
淘宝数据魔方技术架构解析
2012-07-31 10:09 792原文 http://www.programmer.com.c ... -
Apache Hadoop 2.0 Alpha 版发布
2012-07-30 16:10 1897原文 http://www.iteye.com/news/25 ... -
MongoDB Hadoop Connector 1.0 正式版发布
2012-07-30 16:01 927原文 http://www.iteye.com/news/24 ... -
VMware发布开源项目Serengeti,支持云中部署Apache Hadoop
2012-07-30 15:55 815原文 http://www.iteye.com/news/25 ... -
NOSQL数据库大比拼
2012-07-24 14:46 816原文 http://www.jdon.com/3971 ... -
NoSQL数据库探讨之一 - 为什么要用非关系数据库?
2012-07-23 10:50 625NoSQL数据库探讨之一 - ... -
mongodb 应用场景
2012-07-23 10:29 153124 Use Cases24.1 适合场景 Archivin ... -
Hadoop概念及其用法专家讲解
2010-11-08 22:12 1239原文 http://developer.51cto.com/a ... -
开源框架Hadoop实现分布式计算
2010-11-08 22:04 897原文 http://developer.51cto ... -
用 Linux 和 Apache Hadoop 进行云计算
2010-10-31 19:53 1015原文 http://www.ibm.com/dev ... -
NoSQL数据库笔谈
2010-10-27 22:56 1239原著作者 颜开 http://www.yankay.com/w ... -
Mongo和Couch对比
2010-10-25 22:38 1098原文 http://www.jdon.com/jive ...
相关推荐
在Apache Hadoop上的TB字节数量级排序 使用Pig和Wukong来探索10亿数量级边的 网络图 测量社区 每个人都在和我说话:Twitter回复关系图 degree(度) 对称链接 社区提取 附录A 安装Apache Hadoop 先决...
Hadoop是Apache软件基金会开发的一个分布式计算项目,它为大规模数据集(大于1TB)提供了高容错性的分布式存储和计算能力。本课程通过笔记和代码实例,帮助学习者理解并掌握Hadoop的核心概念和技术。 在Hadoop的...
在Apache Hadoop上的TB字节数量级排序 使用Pig和Wukong来探索10亿数量级边的 网络图 测量社区 每个人都在和我说话:Twitter回复关系图 (度)degree 对称链接 社区提取 附录A 安装Apache Hadoop 附录B Cloudera’s ...
- **Apache Hadoop的1TB排序**:讨论了Hadoop在1TB排序挑战中的表现。 #### 十六、Apache Hadoop的安装 - **安装指南**:提供了详细的步骤来安装Apache Hadoop。 #### 十七、Cloudera的Hadoop分发包 - **Cloudera...
MapReduce 是一种编程模型,用于大规模数据集(大于 1TB)的并行计算。它的基本思想是将大任务分解为小任务(映射阶段),然后在多台机器上并行处理这些小任务,最后再将结果合并(化简阶段)。在这个案例中,我们...
- **2008年**:Hadoop在1TB排序测试中创下了世界纪录。 - **2009年**:Hadoop在大规模数据处理方面取得了显著进展,支持多个大型集群。 - **Hadoop版本**: - **社区版本**:这是Hadoop最基础的形式,提供了...
- **MapReduce**:这是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(归纳)”来自函数式编程语言领域,用来简化并行计算的操作。 #### 二、为什么选择Hadoop? Hadoop之...
- **Shuffle阶段**:对Map阶段产生的中间结果进行排序和合并。 - **Reduce阶段**:将Shuffle阶段产生的数据进一步处理,生成最终的结果。 #### 六、Hadoop平台在云计算中的应用案例 通过构建基于Hadoop平台的...
- `mapreduce.task.io.sort.mb` 和 `mapreduce.task.io.sort.factor`: 控制排序阶段使用的内存以及可以同时进行排序的数据分区数量。 - `mapreduce.reduce.shuffle.parallelcopies` 和 `mapreduce.reduce.shuffle....
- Hadoop MapReduce 特别适合处理 TB 或 PB 级别的数据集。 - 如搜索引擎索引构建、社交网络数据分析等。 **2. 实时数据分析** - 虽然 MapReduce 主要用于批处理,但也可以用于实时数据流处理,如通过 Hadoop ...
例如,2008年,Hadoop在900个节点上实现了1TB数据的排序,仅用209秒,展示出其在大数据处理上的强大能力。 Hadoop的应用广泛,包括社交网络(如Facebook)、搜索引擎(如Google)、传统巨头(如IBM)以及国内的众多...
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行处理。该模型的基本组成部分包括Map函数和Reduce函数。具体流程如下: - **Map阶段**:输入数据集被切分为若干个小块,每个小块由Map函数处理,生成键值...
MapReduce是一种编程模型,用于大规模数据集(通常大于1TB)的并行运算。它的设计理念非常简洁明了:把复杂的任务分解为一系列可以并行处理的小任务。具体来说,MapReduce将数据处理过程分为两个阶段:Map阶段和...
**14.6 Apache Hadoop的1TB排序** - **性能测试**: 记录了Apache Hadoop如何在短时间内完成1TB数据的排序测试。 #### 十五、Apache Hadoop的安装 - **安装指南**: 提供了Apache Hadoop的安装指南。 #### 十六、...
案例研究部分展示了Hadoop在实际业务中的应用,如Last.fm、Facebook、Nutch搜索引擎、Rackspace的日志处理和Cascading项目,以及Apache Hadoop的TB级别排序挑战。这些案例揭示了Hadoop在不同场景下的强大功能和灵活...