我对MAP / Reduce Framework有一个普遍的问题。
我有一个任务,可以分成几个分区。对于每个分区,我需要运行一个计算密集型算法。
然后,根据MAP / Reduce Framework,似乎我有两个选择:
在Map阶段运行算法,以便在reduce阶段,除了从Map阶段收集每个分区的结果并进行汇总外,不需要完成任何工作
在Map阶段,只需将分区(包含数据)分割并发送到reduce阶段。在reduce阶段,首先运行算法,然后收集并汇总每个分区的结果。
如果我误解了,请纠正我。
我是初学者。我可能不太了解MAP / Reduce。我只有基本的并行计算概念。
答案 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
中,您有Mapper
和Reducer
。您还有Partitioner
和Combiner
。
Hadoop
是一个分布式文件系统,它将文件分区(或拆分,您可能会说)为BLOCK SIZE
个块。这些分区块位于不同节点上。因此,当作业提交到MapReduce Framework
时,它会将该作业划分为每Mapper
个input split
(现在可以说它是分区块)。由于这些块分布在不同的节点上,因此这些Mappers
也在不同的节点上运行。
在Map
阶段,
RecordReader
分为记录,记录的定义由我们选择的InputFormat
控制。每条记录都是key-value
对。map()
的{{1}}针对每个此类记录运行。此步骤的输出再次位于Mapper
对key-value
的输出使用我们提供的Mapper
或默认Partitioner
进行分区。在此步骤中,通过分区,我的意思是决定哪个HashPartitioner
及其对应的key
转到哪个values
(如果只有一个Reducer
,则无论如何都无用)Reducer
的输出。您可以使用reducer
来执行此操作。请注意,该框架不保证调用Combiner
的次数。它只是优化的一部分。这是您通常编写数据算法的地方。由于这些任务并行运行,因此它非常适合计算密集型任务。
在所有节点上完成所有Combiner
运行之后,中间数据,即Mappers
阶段结束时的数据将被复制到其对应的Map
。
在reducer
阶段,我们Reduce
的{{1}}会在reduce()
的每个数据记录上运行。此处记录包含Reducer
及其对应的Mappers
,不一定只有一个key
。这是您通常运行摘要/聚合逻辑的地方。
当您编写values
个工作时,您通常会考虑value
和MapReduce
中每个数据记录可以执行哪些操作。 Mapper
程序只能包含已实施Reducer
的{{1}}和已实施MapReduce
的{{1}}。通过这种方式,您可以更专注于您想要对数据执行的操作,而不必担心并行化问题。你不必担心工作是如何分裂的,框架会为你做这件事。但是,您迟早要了解它。
我建议您浏览Apache's MapReduce tutorial或Yahoo's Hadoop tutorial以获得良好的概述。我个人喜欢雅虎对Hadoop的解释,但Apache的详细信息很好,他们使用Mapper
程序的解释非常好且直观。
另外,
我有一个任务,可以分成几个分区。对于 每个分区,我都需要运行一个计算密集型算法。
Hadoop分布式文件系统将数据拆分为多个节点,map reduce框架为每个拆分分配任务。因此,在hadoop中,进程将继续执行数据所在的位置。您无法定义要运行的地图任务的数量,数据也是如此。但是,您可以指定/控制reduce任务的数量。
我希望我已经全面回答了你的问题。