区分 Apache Spark 中的驱动程序代码和工作代码
Posted
技术标签:
【中文标题】区分 Apache Spark 中的驱动程序代码和工作代码【英文标题】:Differentiate driver code and work code in Apache Spark 【发布时间】:2016-01-25 03:58:48 【问题描述】:在 Apache Spark 程序中,我们如何知道哪部分代码将在驱动程序中执行,哪部分代码将在工作节点中执行?
【问题讨论】:
【参考方案1】:其实很简单。由转换创建的闭包内发生的所有事情都发生在工作人员身上。这意味着如果在 map(...)
、filter(...)
、mapPartitions(...)
、groupBy*(...)
、aggregateBy*(...)
内部传递了某些内容,则会在工人身上执行。它包括从持久存储或远程源读取数据。
count
、reduce(...)
、fold(...)
等操作通常在驱动程序和工作人员上执行。繁重的工作由工作人员并行执行,一些最后的步骤,例如减少从工作人员收到的输出,在驱动程序上按顺序执行。
其他一切,例如触发动作或转换都发生在驱动程序上。特别是它意味着需要访问SparkContext
的每个操作。在 PySpark 中,它也意味着与 Py4j 网关的通信。
【讨论】:
DataFrame.write (PySpark) 怎么样?它在哪里运行?【参考方案2】:所有作为参数传递给JavaRDD/JavaPairRDD/类似方法的闭包以及这些类的某些方法将由spark节点执行。其他都是驱动代码。
【讨论】:
以上是关于区分 Apache Spark 中的驱动程序代码和工作代码的主要内容,如果未能解决你的问题,请参考以下文章
2018年前100名Apache Spark面试问题和解答(下)
如何优化 Apache Spark 应用程序中的 shuffle 溢出
Apache Spark 和 Apache Flink 中的“流”是啥意思?
Apache Spark 2.2.0 中文文档 - Submitting Applications | ApacheCN
intellij 中 spark scala 应用程序中的线程“main”java.lang.NoClassDefFoundError:org/apache/spark/sql/catalyst/St