何时在Apache Spark中不在driver上运行操作?

3

我刚开始接触Spark,对任务的概念感到困惑。

请问有人能帮助我理解什么情况下动作(例如reduce)不在驱动程序中运行。

根据Spark教程:

"使用函数func(它需要两个参数并返回一个参数)聚合数据集的元素。该函数应该是可交换和可结合的,以便可以正确地并行计算。"

我目前正在尝试一个应用程序,该应用程序读取'n'个文件的目录,并计算单词数。

从Web UI上看,任务数量等于文件数量。所有reduce函数都在驱动节点上执行。

请问是否有场景使得reduce函数不在驱动程序中执行?任务是否总是包括“转换+操作”或只包括“转换”?


你是如何提交要执行的作业的? - Justin Pihony
这是一个集群设置,我通过主节点提交作业。 - ankit409
不,我是真的想知道你是如何提交它的?你的spark-submit命令是什么? - Justin Pihony
/opt/spark/spark-1.3.1/bin/spark-submit --class sampleApp.CoreNLP --executor-memory 17G --master spark://archlab1:7077 --deploy-mode cluster hdfs://10.18.107.136:9000/sampleApp_bp1/target/sampleApp-0.0.1-SNAPSHOT.jar - ankit409
谢谢,经常 OP 没有设置主节点。 - Justin Pihony
2个回答

3

所有操作都是在集群上执行的,操作的结果可能会最终出现在驱动程序上(根据操作而定)。

一般来说,你编写的围绕业务逻辑的spark代码并不实际运行 - 相反,Spark使用它来创建计划,该计划将在集群中执行你的代码。该计划创建一个任务列表,列出了可以在不需要在分区之间传输数据的情况下完成的所有操作。每次Spark需要以不同方式排列数据时(例如排序后),它都会创建一个新任务和第一个任务与后面任务之间的Shuffle。


1
我会尝试回答这个问题,但可能会有一些遗漏。任务确实始终涉及转换和操作。转换是惰性的,并不会提交任何内容,因此需要操作。您可以在RDD上随时调用.toDebugString以查看每个作业拆分的位置;每个缩进级别都是一个新阶段。我认为驱动程序上显示的reduce函数有点误导人,因为它将首先并行运行,然后合并结果。因此,我期望任务确实尽可能在工作人员上运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接