在Reducer Hadoop中迭代两次值

在Reducer Hadoop中迭代两次值,hadoop,mapreduce,Hadoop,Mapreduce,我在几个地方读到,在一个Reducer中迭代两次值的唯一方法是缓存该值 但是,在这种情况下,还有一个限制,即所有值都必须适合主内存 如果您需要迭代两次,但没有在内存中缓存值的特权,该怎么办 有什么解决办法吗 也许关于这个问题有一些答案,但我是Hadoop的新手,所以我希望从提出问题时起就找到了一些解决方案 为了更具体地回答我的问题,我需要做以下几点: Reducer获得一定数量的点(每个示例-具有x、y、z坐标的三维空间中的点) 应该在它们之间选择一个随机点——我们称之为第一点 然后,Red

我在几个地方读到,在一个Reducer中迭代两次值的唯一方法是缓存该值

但是,在这种情况下,还有一个限制,即所有值都必须适合主内存

如果您需要迭代两次,但没有在内存中缓存值的特权,该怎么办

有什么解决办法吗

也许关于这个问题有一些答案,但我是Hadoop的新手,所以我希望从提出问题时起就找到了一些解决方案


为了更具体地回答我的问题,我需要做以下几点:

  • Reducer获得一定数量的点(每个示例-具有x、y、z坐标的三维空间中的点)
  • 应该在它们之间选择一个随机点——我们称之为第一点
  • 然后,Reducer应该找到距离第一个点最远的点,要做到这一点,它需要遍历所有的值——这样我们就得到了第二个点
  • 之后,reducer应该找到距离secondPoint最远的点,所以需要再次遍历数据集-这样我们就得到了第三个点
  • 需要计算从第三个点到所有其他点的距离
需要保存从第二个点到所有其他点的距离以及从第三个点到所有其他点的距离,以便执行其他步骤

缓冲这些距离不是问题,因为每个距离都是双精度的,而一个点实际上可能是n维空间中的一个点,因此每个点可能有n个坐标,因此它可能会占用太多的空间


我最初的问题是如何迭代两次,但我的问题更一般,如何通过多次迭代值来执行上述步骤?

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

您需要通过迭代两次来共享有关您要完成的任务的更具体信息。如果您必须在一次调用中对每组分组记录进行两次迭代以减少,则必须以某种方式(在内存或文件中)对它们进行缓冲。感谢您的兴趣,我已更新了我的问题。您可能需要求助于多个MapReduce作业,每次迭代一个。不幸的是,在MapReduce中,迭代算法并不是很好,因为每个作业都要花费大量的磁盘序列化成本。在这些情况下,SCAPLE通常是一个更好的使用框架,因为任务之间的结果(通常)只停留在内存中。@ JeremyBeard解释的过程在减速机中执行,作为一个迭代的一部分,已经:)我将考虑将此步骤划分为多个步骤。但是,您认为,多次发出数据集(带有一些标记)是否是一个好主意,这样我就可以通过这种方式多次迭代数据集?例如,要发出(point1First,point1),(point1Second,point1),(point1Third,point1)?感谢您的建议,但我无法分割进入reducer的数据。我将更新我的问题以进一步阐述。