Apache spark 火花减少功能:了解其工作原理

Apache spark 火花减少功能:了解其工作原理,apache-spark,reduce,Apache Spark,Reduce,我要这个 它说RDD上的reduce操作是一次一台机器完成的。这意味着,如果您的数据在两台计算机上分割,那么下面的函数将处理第一台计算机中的数据,将找到该数据的结果,然后它将从第二台计算机中获取一个值,运行该函数,并将以这种方式继续,直到处理完来自机器2的所有值为止。这是正确的吗 我认为该函数将同时在两台机器上开始运行,然后一旦有来自两台机器的结果,它将再次最后一次运行该函数 rdd1=rdd.reduce(lambda x,y: x+y) 更新1-----------------------

我要这个

它说RDD上的reduce操作是一次一台机器完成的。这意味着,如果您的数据在两台计算机上分割,那么下面的函数将处理第一台计算机中的数据,将找到该数据的结果,然后它将从第二台计算机中获取一个值,运行该函数,并将以这种方式继续,直到处理完来自机器2的所有值为止。这是正确的吗

我认为该函数将同时在两台机器上开始运行,然后一旦有来自两台机器的结果,它将再次最后一次运行该函数

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中具有不同实现的部分)
因为看起来您正在使用Python,所以让我们看看代码:

  • reduce
    对于用户提供的功能:

    def func(iterator):
        ...
    
  • 这是包装器:

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

  • 使用标准Python在驱动程序上按顺序减少收集的
    VAL

    其中
    f
    是传递给
    RDD.reduce的函数

  • 相比之下,Scala将异步合并部分结果,因为它们来自Worker

    如果是
    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)