Apache spark Spark Shuffle—员工如何知道从何处提取数据

Apache spark Spark Shuffle—员工如何知道从何处提取数据,apache-spark,Apache Spark,我试图理解Spark是如何在引擎盖下洗牌依赖关系的。因此,我有两个问题: 在Spark中,执行者如何从其他执行者那里知道必须从哪些执行者那里提取数据 是否每个执行者在完成其地图端任务后,将其状态和位置更新到某个中心实体(可能是驱动者),并减少侧执行者第一次联系驱动者以获取每个执行者的位置 从那些执行者那里直接拉,然后直接拉 在具有随机播放依赖项的作业中,驱动程序是否仅在所有地图端任务完成后才安排联接(或随机播放依赖项上的其他任务) 这是否意味着每个任务将通知驱动程序其状态,驱动程序将及时协

我试图理解Spark是如何在引擎盖下洗牌依赖关系的。因此,我有两个问题:

  • 在Spark中,执行者如何从其他执行者那里知道必须从哪些执行者那里提取数据

    • 是否每个执行者在完成其地图端任务后,将其状态和位置更新到某个中心实体(可能是驱动者),并减少侧执行者第一次联系驱动者以获取每个执行者的位置 从那些执行者那里直接拉,然后直接拉
  • 在具有随机播放依赖项的作业中,驱动程序是否仅在所有地图端任务完成后才安排联接(或随机播放依赖项上的其他任务)

    • 这是否意味着每个任务将通知驱动程序其状态,驱动程序将及时协调其他相关任务

  • 我将分几点回答你的问题

    1。执行者如何从其他执行者那里知道必须从哪些执行者那里提取数据? 简单地说,执行者不知道其他执行者在做什么,但驱动者知道,您可以将此过程视为皇后和工人,皇后将任务推给执行者,每个执行者完成任务后根据结果返回

    2。每个执行者是否在完成地图端任务后,将其状态和位置更新到某个中心实体(可能是驱动者)

    是的,实际上驱动程序会监视该过程,但当您创建SparkContext时,每个工作程序都会启动一个执行器。这是一个单独的进程(JVM),它也会加载您的jar。执行器连接回您的驱动程序。现在,驱动程序可以向他们发送命令,如示例中的flatMap、map和reduceByKey。当司机退出时,执行人就关门了。你也可以看看这个答案

    3。减少侧面执行器首先联系驾驶员,获取每个执行器的位置,然后直接从这些执行器中拉出? Reduce任务具有在运行数据的同一台机器上运行的优先级,因此,除非数据不可用且没有资源,否则不会有任何随机移动

    4。在具有随机播放依赖项的作业中,驱动程序是否仅在所有地图端任务完成后才安排加入(或随机播放依赖项上的其他任务)?

    它是可配置的,您可以更改它。您可以查看此链接以了解更多信息

    5。这是否意味着每个任务将通知驱动程序其状态,驱动程序将及时协调其他相关任务?


    每个任务通知并向驱动程序发送心跳,spark实现推测性执行技术。因此,如果任何任务失败/变慢,spark将运行另一个任务。更多详情请点击此处

    谢谢Mostafa。这些信息非常有用。关于问题3,我需要澄清一点:假设有一个任务具有Shufferdd依赖性。据我所知,每个映射任务都会将其输出写入其本地磁盘。文件的数量取决于还原程序和分区的数量。在调度还原程序时,它们直接从映射器节点获取此数据。因此,还原程序需要知道映射器节点的网络地址以及为此还原程序编写的文件的名称。减速机是如何获得这些信息的?(已阅读MapOutputTracker源代码,但无法获得清晰的理解)。第一:Spark默认配置不是写入磁盘(它可以更改为MEMORY_AND_disk或disk_ONLY或MEMORY_ONLY),但请记住,如果是磁盘,性能将非常差。第二:考虑你的情况,其实司机是地图与还原之间的主要渠道。所以,除非驾驶员通知,否则减速器不知道任何信息,而且所有配置都是由驾驶员应用的,而不是减速器。总结映射任务完成,然后通知驾驶员任务,然后驾驶员根据作业配置启动减速器。如果我的回答是真的,请注明是真的。