在我的问题中,我有100 TB的数据要处理。这个数据集中的每个文件大约有1mb,可以属于我们定义的10000多个不同“组”中的3个。每个文件组都需要一起处理,一个组中可以有几个到几百个文件。因为我们有数以万计这样的小组,我们认为这是一个很好的候选人mapreduce。
我看到了两种可能的方法来使用hadoop之类的工具设置此作业(可能还有更多):
仅Map:我们按组归档文件,因此拆分和后续Map是在组级别完成的。因为每个map作业都有整个组,所以它可以自己进行处理,我们不需要reduce作业。但我发现这个解决方案有几个问题。首先,由于文件最多可以存在于3个组中,因此按组归档可能会导致存储开销增加三倍,此外还有hadoop的复制因子。此外,像这样归档数据会使它在其他处理不同文件的应用程序中的可用性降低。
reduce only:据我所知,这个范例意味着一个简单的“身份”Map器和一个数据密集型的reducer。在这个解决方案中,文件将无序地存储在磁盘上,Map程序将接收一组要处理的文件。然后Map程序将文件读入内存(至少是它的头信息),以确定它属于哪些组,然后发出(组,文件)对进行缩减。然后,减速机将负责处理这些组。然而,我担心走这条路可能会失去数据局部性的好处,或者让网络陷入太多数据流量的泥潭。
两种方法都有效吗?如果是的话,哪一个会更好?具体地说,我觉得我非常了解map-only解决方案的优缺点,但不是reduce-only。我不确定“数据本地”reduce jobs是什么,或者在reduce任务中做“繁重的工作”是否被认为是不好的做法。
2条答案
按热度按时间8qgya5xd1#
出于性能原因,我建议选择map only解决方案而不是reduceonly解决方案。
在我的理解中,通过洗牌机制传递数据是非常计算密集的。它同时加载cpu(序列化)、磁盘(因为所有数据至少存储在磁盘上一次)和网络传输数据。
据我估计,洗牌比通过非本地hdfs文件加载数据要贵几倍。
考虑到您的数据大小,并考虑到在洗牌期间数据将增长(因为序列化开销),我还将考虑只Map的解决方案,以避免磁盘空间不足。
ycggw6v22#
两种方法似乎都有效。我想最好的办法是两者都试一下。然而,在我看来,“reduce only”版本对于hadoop中实现的map reduce作业更为典型,因为框架本身将负责对文件进行分组。
然而,它的效率严格依赖于必须执行的计算。计算是什么?更具体地说:
你能同时处理一组元素的子集吗?如果是这种情况,你可以使用一个组合器大大减少网络流量。
你能为这些团体想出不同的组织吗?