我正在学习课程。
它说RDD上的reduce操作是逐台机器完成的。这意味着,如果您的数据分布在两台计算机上,那么下面的函数将在第一台计算机上处理数据,找到该数据的结果,然后它将从第二台计算机中获取单个值,运行函数,并继续这种方式,直到完成所有来自第二台机器的值。这正确吗?
我认为函数将同时开始在两台机器上操作,然后一旦它从两台机器获得结果,它将再次运行最后一次函数。
rdd1=rdd.reduce(lambda x,y: x+y)
更新 1--------------------------------------------
以下步骤是否比 reduce 函数更快获得答案?
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())
reduce
,除了驱动程序部分外,使用的机制与标准Spark转换相同,因此表现出相同的并行性。 - zero323aggregate
和reduce
之间不应该有显著的性能差异。 b) 我无法提供示例,因为通常顺序是不确定的。您可以在这里看到非常粗略的可视化效果(https://dev59.com/-5Pfa4cB1Zd3GeqPG7jJ),但从根本上讲,操作是不同步的。 c) 关于Scala - 正如我已经说过的那样 - Scala通过异步方式获取任务结果,而不是通过收集。 - zero323reduce
最终也是在驱动程序中执行的,我理解正确吗?谢谢。 - jack