火花减少功能:了解它是如何工作的

时间:2016-03-24 16:48:59

标签: apache-spark reduce

我正在接受这个course

它说RDD上的reduce操作一次只能在一台机器上完成。这意味着如果您的数据分成两台计算机,那么下面的函数将对第一台计算机中的数据起作用,将找到该数据的结果,然后它将从第二台机器获取单个值,运行该函数并继续这样,直到它完成机器2的所有值。这是正确的吗?

我认为该功能将同时开始在两台机器上运行,然后一旦有2台机器的结果,它将再次运行该功能

rdd1=rdd.reduce(lambda x,y: x+y)

update 1 -------------------------------------------- < / H1> 与降低功能相比,

下面的步骤会给出更快的答案吗?

Rdd=[3,5,4,7,4]
seqOp = (lambda x, y: x+y)
combOp = (lambda x, y: x+y)
collData.aggregate(0, seqOp, combOp)

更新2 -----------------------------------

以下两组代码是否应在相同的时间内执行?我检查过,似乎两者都是同一时间。

import datetime

data=range(1,1000000000)
distData = sc.parallelize(data,4)
print(datetime.datetime.now())
a=distData.reduce(lambda x,y:x+y)
print(a)
print(datetime.datetime.now())

seqOp = (lambda x, y: x+y)
combOp = (lambda x, y: x+y)
print(datetime.datetime.now())
b=distData.aggregate(0, seqOp, combOp)
print(b)
print(datetime.datetime.now())

1 个答案:

答案 0 :(得分:3)

def func(iterator): ... 行为在本机(Scala)和客户语言(Python)之间略有不同,但稍微简化了一些事情:

  • 逐个元素地按顺序处理每个分区
  • 多个分区可以由单个工作者(多个执行程序线程)或不同的工作程序同时处理
  • 将部分结果提取给应用最终缩减的驱动程序(这是在PySpark和Scala中具有不同实现的部分)

由于您似乎正在使用Python,因此请查看代码:

  1. vals = self.mapPartitions(func).collect() creates a simple wrapper用户提供的功能:

    vals
  2. 这是包装器is used to mapPartitions

    reduce(f, vals)
    

    很明显,这段代码令人尴尬地并行,并不关心如何利用结果

  3. 使用标准Python reduce在驱动程序上按顺序减少收集的f

    RDD.reduce

    其中treeReduce是传递给reduce

  4. 的函数

    相比之下,Scala将异步合并部分结果,因为它们来自工作者。

    mapPartitions步骤3的情况下,也可以以分布式方式执行。见Understanding treeReduce() in Spark

    总结map(不包括驱动程序端处理)使用与filterf等基本转换完全相同的机制(tree*),并提供相同的级别并行性(再次排除驱动程序代码)。如果您有大量分区或{{1}}价格昂贵,则可以使用{{1}}系列方法并行/分发最终合并。