繁体   English   中英

spark驱动程序如何序列化发送给执行程序的任务?

[英]How spark driver serializes the task that is sent to executors?

RDD通过对象中的用户定义函数/方法进行一系列转换。 并且这些函数以任务的形式传递给执行程序。 这些任务是spark-core中定义的Scala类的实例。

我假设用户定义的函数/方法包装在一个任务对象中并传递给执行程序。

  1. 执行者如何知道包含在任务类中的需要执行的方法是什么?

  2. 序列化到底有何帮助?

  3. spark上下文如何读取用户代码并将其转换为任务?

关于spark上下文如何读取用户代码并将其转换为任务?

驱动程序代码生成作业,阶段和任务。

整个驱动程序代码可以作为一个应用程序调用,每个操作构成一个作业。

当作业提交给驱动程序时,作业分为逻辑计划和物理计划。

在逻辑计划期间,transformations()构建一系列RDD的计算。 由于每个action()触发一个作业,因此在物理计划期间,转换的完整依赖图被分为几个阶段。 与hadoop不同,执行过程是固定的map-shuffle-sort-aggregate,spark没有固定的执行过程。 当数据以流方式实际需要时计算数据。 它从RDD的最终结果开始,并向后检查RDD链,以找出计算最终结果所需的RDD和parititons。 在回溯期间,如果它遇到ShuffleDependency,它会切断数据流并形成一个新的阶段,通过NarrowDepedency离开RDD的链接。 因此,ShuffleDependency突破了一个新阶段。

在每个阶段中,任务都被完成,数据通过转换进行流水线操作。 任务数等于每个阶段的RDD中的分区数。

所有任务都打包在TaskSet中并发送到TaskScheduler。驱动程序actor将序列化的任务发送到工作节点上的CoarseGrainedExecutorBackend Actor。 收到后,执行程序将其反序列化为正常任务并运行以获得结果。 将通知TaskScheduler任务已完成,并将处理其结果

如果接收到的驱动程序任务是该阶段的最后一项任务,则将提交下一阶段。 如果舞台已经是最后一个舞台,则会通知dagScheduler作业已完成。

从spark 1.4版本开始,Spark UI中添加了新的可视化。 我们可以在哪里看到不同阶段的DAG可视化。

从根本上传递的Spark函数基于Java Serialization 在Java中,您可以将任意代码传递给网络上的其他计算机,可以是简单的案例类或任何具有任何行为的类。

只有一个要求 - 序列化类需要位于目标JVM的类路径中。

在启动时,当您使用spark-submit它会将您的jar文件分发到所有Spark工作节点,它允许驱动程序将序列化函数传递给工作节点,并且因为序列化类在类路径中,所以从驱动程序发送的任何函数都可以反序列化。

Spark没有为RDD转换定义任何特定的Task类。 如果您使用Scala进行map操作,则会发送scala Function1序列化版本。

如果你使用按键等的aggregate / reduce,它可以是Function2 无论如何,它不是Spark特有的,它只是普通的Scala(Java)类。

一点解释:

执行者如何知道包含在任务类中的需要执行的方法是什么?

执行程序接收带有任务描述的RPC消息,见下文

序列化到底有何帮助?

是的,该任务包含由closureSerializer序列化的代码

spark上下文如何读取用户代码并将其转换为任务?

在REPL环境中,spark将用户代码编译为类文件并放在文件服务器上,执行器实现了一个自定义类加载器,它从驱动程序端的文件服务器加载类; 该类实际上是一个针对记录迭代器运行的函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM