【问题标题】:Iterate twice through values in Reducer Hadoop遍历 Reducer Hadoop 中的值两次
【发布时间】: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)?

标签: hadoop mapreduce


【解决方案1】:

它可能不适用于所有情况,但您可以尝试运行更多的 reducer,以便每个 reducer 处理足够少的数据,然后您可以将值缓存到内存中。

【讨论】:

  • 感谢您的建议,但我无法拆分进入减速器的数据。我将更新我的问题以详细说明。
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2012-11-10
  • 2016-11-06
相关资源
最近更新 更多