我正在接受这个course。
它说RDD上的reduce操作一次只能在一台机器上完成。这意味着如果您的数据分成两台计算机,那么下面的函数将对第一台计算机中的数据起作用,将找到该数据的结果,然后它将从第二台机器获取单个值,运行该函数并继续这样,直到它完成机器2的所有值。这是正确的吗?
我认为该功能将同时开始在两台机器上运行,然后一旦有2台机器的结果,它将再次运行该功能
rdd1=rdd.reduce(lambda x,y: x+y)
下面的步骤会给出更快的答案吗?
Rdd=[3,5,4,7,4]
seqOp = (lambda x, y: x+y)
combOp = (lambda x, y: x+y)
collData.aggregate(0, seqOp, combOp)
以下两组代码是否应在相同的时间内执行?我检查过,似乎两者都是同一时间。
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())
答案 0 :(得分:3)
def func(iterator):
...
行为在本机(Scala)和客户语言(Python)之间略有不同,但稍微简化了一些事情:
由于您似乎正在使用Python,因此请查看代码:
vals = self.mapPartitions(func).collect()
creates a simple wrapper用户提供的功能:
vals
这是包装器is used to mapPartitions
:
reduce(f, vals)
很明显,这段代码令人尴尬地并行,并不关心如何利用结果
使用标准Python reduce
在驱动程序上按顺序减少收集的f
:
RDD.reduce
其中treeReduce
是传递给reduce
相比之下,Scala将异步合并部分结果,因为它们来自工作者。
在mapPartitions
步骤3的情况下,也可以以分布式方式执行。见Understanding treeReduce() in Spark
总结map
(不包括驱动程序端处理)使用与filter
或f
等基本转换完全相同的机制(tree*
),并提供相同的级别并行性(再次排除驱动程序代码)。如果您有大量分区或{{1}}价格昂贵,则可以使用{{1}}系列方法并行/分发最终合并。