ChatGPT解决这个技术问题 Extra ChatGPT

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

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

这里有几个问题:

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


S
Sean Owen

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

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

对于许多应用程序,工人拥有许多执行者。一个应用程序有许多工人的执行者。

你的第三个问题不清楚。


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

扩展到其他很好的答案,我想用几张图片来描述。

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

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

https://i.stack.imgur.com/rv96i.png

如果您对 Spark 如何与 YARN 一起工作感到好奇?检查这篇文章Spark on YARN

1. 两个worker实例是指一个worker节点有两个worker进程吗?

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

1 Node = 1 Worker process

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

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

https://i.stack.imgur.com/D7pcV.png

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

3. 是否有流程图说明 spark 运行时如何?

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

https://i.stack.imgur.com/SXQHj.jpg

HIH


非常好的和详尽的答案,太糟糕了,张贴者已经接受了答案
很棒的帖子-谢谢!一个问题:您说“节点(物理或虚拟机)和工作人员的建议映射是,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 发生的时间(日志暂停)就越多。抱歉回复晚了,不知怎的,我错过了你的评论。
这是个好建议;我更新了答案。我的印象是第二张图片将解释更多关于工人的信息。
L
Lan

我知道这是一个老问题,肖恩的回答非常好。我的文章是关于 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 个执行者吗?我最近问过这样的问题,你可以回答,stackoverflow.com/questions/54364403/…
U
Uli Bethke

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

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