Apache spark 火花减少功能:了解其工作原理
我要这个 它说RDD上的reduce操作是一次一台机器完成的。这意味着,如果您的数据在两台计算机上分割,那么下面的函数将处理第一台计算机中的数据,将找到该数据的结果,然后它将从第二台计算机中获取一个值,运行该函数,并将以这种方式继续,直到处理完来自机器2的所有值为止。这是正确的吗 我认为该函数将同时在两台机器上开始运行,然后一旦有来自两台机器的结果,它将再次最后一次运行该函数Apache spark 火花减少功能:了解其工作原理,apache-spark,reduce,Apache Spark,Reduce,我要这个 它说RDD上的reduce操作是一次一台机器完成的。这意味着,如果您的数据在两台计算机上分割,那么下面的函数将处理第一台计算机中的数据,将找到该数据的结果,然后它将从第二台计算机中获取一个值,运行该函数,并将以这种方式继续,直到处理完来自机器2的所有值为止。这是正确的吗 我认为该函数将同时在两台机器上开始运行,然后一旦有来自两台机器的结果,它将再次最后一次运行该函数 rdd1=rdd.reduce(lambda x,y: x+y) 更新1-----------------------
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
本机语言(Scala)和来宾语言(Python)的行为略有不同,但简化了一点:
- 每个分区都是按顺序逐元素处理的
- 多个分区可以由单个工作线程(多个执行线程)或不同的工作线程同时处理
- 部分结果被获取到应用最终缩减的驱动程序(这是一个在PySpark和Scala中具有不同实现的部分)
reduce
对于用户提供的功能:
def func(iterator):
...
VAL
:
其中f
是传递给RDD.reduce的函数
t,则减少步骤3。也可以以分布式方式执行。看
总而言之,reduce
(不包括驱动程序端处理)使用与基本转换完全相同的机制(mapPartitions
),如map
或filter
,并提供相同级别的并行性(再次不包括驱动程序代码)。如果你有大量的分区或者f
很昂贵,你可以使用tree*
方法系列并行/分发最终合并。我读了你的答案。我很难理解你的意见,也很难弄清楚课程中的陈述是否正确。基于“可以由单个工作线程(多个执行线程)或不同的工作线程同时处理多个分区”,该语句似乎是不正确的。请直接回答?请用一个例子强调你的意思-例如RDD是[1,2,3,4,5,6]和[1,2,3]在一台机器上,其余的元素在另一台机器上..spark和scala如何分别处理这些?谢谢你的工作,我还没有看过这门课,所以我不能提及这一点,但如果他们真的告诉你,这是在你花200美元的时候完成的reduce
,不包括驱动程序部分,使用相同的机制是标准的Spark转换,因此表现出相同的并行性。请使用示例强调您所说的内容-例如RDD是[1,2,3,4,5,6]和[1,2,3]在一台机器上,其余的元素在另一台机器上..spark和scala如何以不同的方式处理这些?也可以回答我更新的问题吗?a)聚合和减少之间不应该有显著的性能差异。b)我不能使用示例,因为通常顺序是不确定的。您可以看到非常粗糙的可视化,但基本上操作是不同步的。3) 关于Scala-正如我已经说过的-Scala异步获取任务结果,而不是通过collect。@zero323从您的回答中,我知道reduce
最终也会在驱动程序中执行,对吗?谢谢
vals = self.mapPartitions(func).collect()
reduce(f, vals)