工人、工人实例和执行者之间的关系是啥?

Posted

技术标签:

【中文标题】工人、工人实例和执行者之间的关系是啥?【英文标题】:What is the relationship between workers, worker instances, and executors?工人、工人实例和执行者之间的关系是什么? 【发布时间】:2014-07-11 11:34:32 【问题描述】:

Spark Standalone 模式中,有主节点和工作节点。

这里有几个问题:

    2个工作实例是否意味着一个工作节点有2个工作进程? 是每个工作程序实例都为特定应用程序(管理存储、任务)持有一个执行程序,还是一个工作程序节点持有一个执行程序? 是否有解释 spark 在运行时如何工作的流程图,例如字数统计?

【问题讨论】:

【参考方案1】:

我建议先阅读Spark cluster docs,但更重要的是阅读Cloudera blog post 解释这些模式。

您的第一个问题取决于您所说的“实例”是什么意思。节点是一台机器,没有充分的理由在每台机器上运行多个工作人员。因此,两个工作节点通常意味着两台机器,每台机器都是 Spark 工作人员。

Workers 拥有许多 executor,用于许多应用程序。一个应用程序在许多工作人员上都有执行程序。

你的第三个问题不清楚。

【讨论】:

1.第一个问题来自spark-env.sh:SPARK_WORKER_INSTANCES,设置每个节点的worker进程数。 2.StandaloneExecutorBackend这个类就是所谓的Executor吗? 3.你能解释一下wordcount是如何进入spark的,数据是如何通过图片传输不同节点的:) '节点是一台机器,没有充分的理由在每台机器上运行多个工作程序。'你为什么这么说,你能解释一下吗?如果一个节点有良好的内存,它可以在同一台机器上拥有 2 个或更多的执行器。 其他条件相同,最好让一个进程管理所有这些资源,而不是两个。我能想到的例外情况有些极端——如果你有 256GB 的内存,你可能不想要一个 256GB 的单个 JVM 堆,因为 GC 可能需要一段时间。或者您可能有一些非线程安全的本机库,要求您为每个执行程序运行一个任务,因此需要多个执行程序。但这些都是例外。 Clouder 博客链接中断use this one【参考方案2】:

延伸到其他很棒的答案,我想用几张图片来描述。

在 Spark Standalone 模式下,有主节点和工作节点。

如果我们在独立模式下在一个地方同时代表 master 和 worker(如果 CPU 和内存可用,每个 worker 可以有多个 executor)。

如果您对 Spark 如何与 YARN 协同工作感到好奇?查看此帖子Spark on YARN

1.两个worker实例是否意味着一个worker节点有两个worker进程?

通常,我们将工作实例称为从属实例,因为它是执行 spark 任务/作业的进程。节点(物理机或虚拟机)和工作器的建议映射是,

1 Node = 1 Worker process

2。是每个工作程序实例都为特定应用程序(管理存储、任务)持有一个执行程序,还是一个工作程序节点持有一个执行程序?

是的,一个工作节点可以拥有多个执行器(进程)如果它有足够的 CPU、内存和存储空间

检查给定图像中的 Worker 节点。

顺便说一句,在给定时间点工作节点中的执行程序数量完全取决于集群上的工作负载节点的能力 运行多少个执行器。

3.是否有解释 spark 运行时的流程图?

如果我们从 Spark 的角度查看程序的任何资源管理器的执行情况,其中join 两个rdds 并执行一些reduce 操作然后filter

【讨论】:

非常好的和详尽的答案,可惜发帖者已经接受了答案 优秀的帖子-谢谢!一个问题:您说“节点(物理或虚拟机)和工作人员的建议映射是,1 个节点 = 1 个工作进程”。但是 spark.apache.org/docs/latest/hardware-provisioning.html 上的 Spark 文档说“请注意,Java VM 在 RAM 超过 200 GB 时并不总是表现良好。如果您购买的机器的 RAM 比这多,您可以在每个节点上运行多个工作 JVM”那么,您的建议是假设这个 JVM RAM 限制吗?或者(我怀疑)这个 RAM 限制是基于旧 JVM 的,它们的内存收集不太健壮? @Brian:我假设 JVM(尤其是堆)的内存越多,GC 发生的时间(日志暂停)就越多。抱歉回复晚了,不知怎的错过了你的评论。 这是个好建议;我更新了答案。我的印象是第二张图片将解释更多关于工人的信息。【参考方案3】:

我知道这是一个老问题,肖恩的回答非常好。我的文章是关于 MrQuestion 评论中的 SPARK_WORKER_INSTANCES。如果你使用 Mesos 或 YARN 作为你的集群管理器,你可以在一台机器上运行多个执行器,只有一个 worker,因此实际上没有必要在每台机器上运行多个 worker。但是,如果您使用独立的集群管理器,目前它仍然只允许每个物理机器上的每个工作进程有一个执行器。因此,如果您有一台超大型机器并想在其上运行多个执行器,则必须启动多个工作进程。这就是 spark-env.sh 中的 SPARK_WORKER_INSTANCES 的用途。默认值为 1。如果您确实使用此设置,请确保您明确设置 SPARK_WORKER_CORES 以限制每个工作人员的核心,否则每个工作人员将尝试使用所有核心。

这个独立的集群管理器限制应该很快就会消失。根据SPARK-1706,此问题将在 Spark 1.4 中修复并发布。

【讨论】:

那么它现在在最新的 Spark 版本中是如何工作的?我可以通过设置执行者的核心数量来操纵工人的数量。就像工人有 16 个核心,我给执行者核心是 4,我每个工人会有 4 个执行者吗?我最近问了这样一个问题,你可以回答,***.com/questions/54364403/…【参考方案4】:

正如 Lan 所说,使用多个工作实例仅在独立模式下相关。您希望拥有多个实例的原因有两个:(1) 垃圾暂停收集器会损害大型 JVM 的吞吐量 (2) >32 GB 的堆大小不能使用 CompressedOoops

阅读更多关于how to set up multiple worker instances的信息。

【讨论】:

以上是关于工人、工人实例和执行者之间的关系是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java中多线程地并发运行是啥意思?有啥作用.好处?

Odoo 中的“工人”是啥?

工人 puma 日志提前终止是啥意思,为啥会发生?

芹菜工人的水平尺度导致相同的处理时间

每个工作有 2 个工人的分配问题

为啥增加工人数量(超过核心数量)仍然会减少执行时间?