在Map / Reduce Framework中添加特定功能的位置

时间:2014-07-06 00:26:43

标签: hadoop mapreduce distributed-computing

我对MAP / Reduce Framework有一个普遍的问题。

我有一个任务,可以分成几个分区。对于每个分区,我需要运行一个计算密集型算法。

然后,根据MAP / Reduce Framework,似乎我有两个选择:

在Map阶段运行算法,以便在reduce阶段,除了从Map阶段收集每个分区的结果并进行汇总外,不需要完成任何工作

在Map阶段,只需将分区(包含数据)分割并发送到reduce阶段。在reduce阶段,首先运行算法,然后收集并汇总每个分区的结果。

如果我误解了,请纠正我。

我是初学者。我可能不太了解MAP / Reduce。我只有基本的并行计算概念。

2 个答案:

答案 0 :(得分:0)

你真的很困惑。在广义和一般意义上,map部分接受任务并将其划分为大约n个节点左右。接收整个任务的一小部分的那些n个节点对他们的作品做了一些事情。完成计算其数据的某些步骤后,reduce操作会重新组装数据。

map-reduce的实力是它的可扩展性。

如果数据集D在map-reduce集群m上运行,其下有n个节点,则每个节点都映射该任务的1 / D部分。然后,具有n个节点的集群m将这些块减少为单个元素。现在,将节点q作为集群n,其下有p个节点。如果m指定q 1 / D,则q可以相对于n将1 / D映射到(1 / D)/ p。然后,n的节点可以将数据减少回q,其中q可以将其数据提供给其邻居m。

有意义吗?

答案 1 :(得分:0)

MapReduce中,您有MapperReducer。您还有PartitionerCombiner

Hadoop是一个分布式文件系统,它将文件分区(或拆分,您可能会说)为BLOCK SIZE个块。这些分区块位于不同节点上。因此,当作业提交到MapReduce Framework时,它会将该作业划分为每Mapperinput split(现在可以说它是分区块)。由于这些块分布在不同的节点上,因此这些Mappers也在不同的节点上运行。

Map阶段,

  1. 文件由RecordReader分为记录,记录的定义由我们选择的InputFormat控制。每条记录都是key-value对。
  2. 我们map()的{​​{1}}针对每个此类记录运行。此步骤的输出再次位于Mapper
  3. 我们key-value的输出使用我们提供的Mapper或默认Partitioner进行分区。在此步骤中,通过分区,我的意思是决定哪个HashPartitioner及其对应的key转到哪个values(如果只有一个Reducer,则无论如何都无用)
  4. 或者,您还可以组合/最小化发送到Reducer的输出。您可以使用reducer来执行此操作。请注意,该框架不保证调用Combiner的次数。它只是优化的一部分。
  5. 这是您通常编写数据算法的地方。由于这些任务并行运行,因此它非常适合计算密集型任务。

    在所有节点上完成所有Combiner运行之后,中间数据,即Mappers阶段结束时的数据将被复制到其对应的Map

    reducer阶段,我们Reduce的{​​{1}}会在reduce()的每个数据记录上运行。此处记录包含Reducer及其对应的Mappers,不一定只有一个key。这是您通常运行摘要/聚合逻辑的地方。


    当您编写values个工作时,您通常会考虑valueMapReduce中每个数据记录可以执行哪些操作。 Mapper程序只能包含已实施Reducer的{​​{1}}和已实施MapReduce的{​​{1}}。通过这种方式,您可以更专注于您想要对数据执行的操作,而不必担心并行化问题。你不必担心工作是如何分裂的,框架会为你做这件事。但是,您迟早要了解它。

    我建议您浏览Apache's MapReduce tutorialYahoo's Hadoop tutorial以获得良好的概述。我个人喜欢雅虎对Hadoop的解释,但Apache的详细信息很好,他们使用Mapper程序的解释非常好且直观。

    另外,

      

    我有一个任务,可以分成几个分区。对于   每个分区,我都需要运行一个计算密集型算法。

    Hadoop分布式文件系统将数据拆分为多个节点,map reduce框架为每个拆分分配任务。因此,在hadoop中,进程将继续执行数据所在的位置。您无法定义要运行的地图任务的数量,数据也是如此。但是,您可以指定/控制reduce任务的数量。

    我希望我已经全面回答了你的问题。