Apache Spark 如何收集和协调来自执行程序的结果
Posted
技术标签:
【中文标题】Apache Spark 如何收集和协调来自执行程序的结果【英文标题】:How Apache Spark collects and coordinate the results from executors 【发布时间】:2019-11-04 06:11:22 【问题描述】:发布此问题以了解 。
假设我正在运行一个有 3 个执行者的工作。我的 DataFrame 已分区并跨这 3 个执行程序运行。 所以现在,当我在 DataFrame 上执行 count() 或 collect() 操作时,spark 将如何协调这 3 个执行器的结果?
val prods = spark.read.format("csv").option("header", "true").load("testFile.csv")
prods.count(); // How spark collect data from three executors? Who will coordinate the result from different executors and give it to driver?
【问题讨论】:
【参考方案1】:prods.count(); // spark如何从三个执行器收集数据?谁来协调不同执行者的结果并交给司机?
当您执行 spark-submit 时,您指定 master 一个客户端程序(驱动程序)开始在 yarn 上运行,如果 yarn 指定为 master 或本地(如果指定 local)。 https://spark.apache.org/docs/latest/submitting-applications.html
由于您在问题中添加了标签yarn,我假设您的意思是yarn-url,所以yarn在集群的任何节点上启动客户端程序(驱动程序)并注册并将工作人员(执行程序)分配给驱动程序,以便任务在每个节点上执行。每个转换/动作在每个工作节点(执行程序)上并行运行。一旦每个节点完成作业,它们就会将结果返回给驱动程序。
【讨论】:
嗨塔伦;感谢您的努力。我了解 yarn 以及它如何为 spark 应用程序分配资源。但这不是我想要的答案。如果有任何混淆,我将从问题中删除纱线标签。【参考方案2】:Oki,你不清楚哪一部分?
让我说得通俗一点,客户端/驱动程序启动并请求主本地/独立主/纱线(又名集群管理器)驱动程序需要资源来执行任务,因此为此分配驱动程序与工作人员。集群管理器在return 分配工作人员,在工作节点上启动执行程序,并将信息提供给客户端程序,您可以使用这些工作人员来完成工作。因此,数据在每个工作人员节点中划分并完成并行任务/转换。一旦收集()或计数() 被调用(我假设这是工作的最后一部分)。然后每个执行程序将其结果返回给驱动程序。
【讨论】:
好的,执行器将其结果返回给驱动程序。同意。那么谁来协调结果。因为我有 3 个执行者,他们的工作是总结从每个执行者那里收到的count
执行者处理任务,结果通过集群管理器返回给驱动程序。每个工作人员的工作就是将分区数据汇总到那里并将结果返回给驱动程序。data-flair.training/blogs/how-apache-spark-works。您也可以通过youtube.com/watch?v=49Hr5xZyTEA&t=317s
正如你所说的每个分区都会汇总其数据,假设 executor-1 有 15 行数据,executor-2 有 10 行,executor-3 有 25 行。所以最后当我执行计数操作时,我将得到 50 作为输出。我知道执行程序将结果数据发送给驱动程序。因此,为了将 50 显示为输出,某些程序/服务必须总结 executor-1、2 和 3 的结果。谁来做那部分?以上是关于Apache Spark 如何收集和协调来自执行程序的结果的主要内容,如果未能解决你的问题,请参考以下文章
如何减少来自 kafka 的 spark 数据帧并收集结果?