【发布时间】:2015-03-25 23:07:12
【问题描述】:
我在几个地方读到,在 Reducer 中迭代两次值的唯一方法是缓存这些值。
但是,在这种情况下,所有值都必须适合主内存。
如果您需要迭代两次,但又没有将值缓存在内存中的奢侈,该怎么办?
有什么解决办法吗?
也许有一些关于这个问题的答案,但我是 Hadoop 的新手,所以我希望自从提出问题以来就找到了一些解决方案。
更具体地说,我的问题是我需要做的:
- Reducer 获得一定数量的点(例如 - 3D 空间中具有 x、y、z 坐标的点)
- 应该选择它们之间的一个随机点 - 我们称之为 firstPoint
- 然后,Reducer 应该找到离 firstPoint 最远的点,为此它需要遍历所有值 - 这样我们得到 secondPoint
- 之后,reducer 应该找到离 secondPoint 最远的点,因此需要再次遍历数据集 - 这样我们就得到了thirdPoint
- 需要计算从 thirdPoint 到所有其他点的距离
需要保存从 secondPoint 到所有其他点的距离和从 thirdPoint 到所有其他点的距离,因此可以执行额外的步骤。
缓冲这个距离不是问题,因为每个距离都是双倍的,而一个点实际上可能是 n 维空间中的一个点,所以每个点可以有 n 个坐标,所以它可能会占用太多空间。
我最初的问题是如何迭代两次,但我的问题更笼统,如何通过值多次迭代以执行上述步骤?
【问题讨论】:
-
您需要通过迭代两次来分享有关您尝试完成的任务的更具体信息。如果您绝对必须在一次调用中遍历每组分组记录两次以减少,您必须以某种方式缓冲它们(在内存中或在文件中)。
-
感谢您的关注,我已经更新了我的问题。
-
您可能需要使用多个 MapReduce 作业,每次迭代一个。不幸的是,迭代算法在 MapReduce 中并不是很好,因为每个作业的磁盘序列化成本很高。在这些情况下,Spark 通常是一个更好的框架,因为任务之间的结果(通常)只保留在内存中。
-
@JeremyBeard 解释的过程在reducer 中作为一个迭代的一部分执行,已经:) 我将考虑将此步骤划分为多个步骤。但是您认为,多次发出数据集并带有一些标记是个好主意,这样我就可以以这种方式多次迭代它吗?例如发出 (point1First, point1), (point1Second, point1), (point1Third, point1)?