2012-12-02 209 views
1

在我的问题我有100TB的数据进行处理。该数据集中的每个文件大约为1MB,并且可以属于我们定义的超过10,000个不同“组”中的3个。每组文件都需要一起处理,组中可以有几个文件到几百个文件。由于我们有成千上万个这样的组织,我们认为这是MapReduce的一个好选择。MapReduce:Map-only还是Reduce-only?

我看到的东西两种可能的方法来建立这个工作(也许还有更多),Hadoop等:

  1. 仅映射的:我们存档按组的文件,因此分裂和随后的映射是在集团层面完成的。由于每个地图作业都有整个组,所以它可以自己完成处理,并且我们不需要减少作业。但是我发现这个解决方案存在一些问题。首先,由于文件最多可以存在3个组,除了Hadoop的复制因素之外,按组归档可能会导致存储开销增加三倍。此外,像这样归档数据会使其在其他处理文件的应用程序中有所不同。

  2. 减少,仅:据我了解,这种模式意味着一个简单的“身份”映射和数据密集型减速。在此解决方案中,文件将无序存储在磁盘上,映射程序将收到一组要处理的文件。然后,映射器将文件读入内存(至少是它的头文件信息)以确定它属于哪个组,然后发出(组,文件)对以减少。减速器将负责处理这些组。但是,我担心我们可能会失去数据局部性的好处,或者通过走这条路线而导致数据流量太大而导致网络停滞。

这两种方法都有效吗?如果是这样,哪个会更受欢迎?具体来说,我觉得我很了解Map-only解决方案的优点和缺点,但不是仅限于Reduce。我不确定“数据本地”如何减少工作,或者如果认为在减少任务中执行“繁重工作”是不好的做法。

回答

0

为了性能的原因,我会建议选择纯地图解决方案而不是仅限于解决方案。
在我的理解中,通过混排机制传递数据的计算量非常大。它加载CPU(串行化),磁盘(因为所有存储在磁盘上的数据至少一次)和网络 - 传递数据。
在我的估计中,通过非本地HDFS文件加载数据时,洗牌要花费几倍的代价。
考虑到您的数据大小,并考虑到洗牌期间数据将增加(由于序列化开销),我还会考虑Map only解决方案以避免磁盘空间不足。

+0

真棒,这绝对回答了我关于将数据处理卸载到减速器的成本的问题。这听起来像是,一般来说,你想尝试在mappers中完成大部分工作,对吗?确切地说, –

+0

。我总是喜欢在mapper上执行大部分工作,并尽量减少传递给reducers的数据。 –

0

这两种方法似乎都有效。我想最好的做法是尝试两种。 然而,在我看来,对于在Hadoop中实现的Map Reduce作业而言,“Reduce-only”版本更为典型,因为框架本身将负责对文件进行分组。

但是,效率严格依赖于必须执行的计算。什么是计算?更具体地说:

  1. 你可以一起处理一个组的元素的子集吗?如果是这种情况,您可以使用组合器,大大减少网络流量。

  2. 你能想到不同的组织为组?

+0

我们实际上共有超过10,000组,但每个文件最多可以有3个组(即组不是数据分区,有一些重叠)。所以理论上我们可以一次处理所有> 10,000个组。在这种情况下执行的计算是波形数据的互相关,所以我们可以沿着相关矩阵的对角线进一步划分组。 –

+0

combinator听起来很有趣,但我对函数式编程不够熟悉,看看如何应用它来减少网络流量。你能详细说明一下吗?谢谢你的帮助! –

+0

那么,在Hadoop中,每个映射器都被分配了一个工作量,它至少等于一个文件或一个文件块,遵循数据局部性原则。 组合器是一个后映射器函数,它在给定节点上的映射器输出的对上执行。 这是一种就地减少操作,通常在减少操作减少数据大小的假设下(一般情况下)减少传输的数据量,因为它是在适当的位置(在内存中)完成的。 看看wourdcount组合器在这里的例子:http://wiki.apache.org/hadoop/HadoopMapReduce – igon