首页 文章

Spark Standalone集群中的工作者,执行者和核心是什么?

提问于
浏览
155

我读了Cluster Mode Overview,我仍然无法理解 Spark Standalone cluster 中的不同过程和并行性 .

工作者是否是JVM进程?我运行 bin\start-slave.sh 并发现它产生了worker,它实际上是一个JVM .

根据上面的链接,执行程序是为运行任务的工作节点上的应用程序启动的进程 . Executor也是一个JVM .

这些是我的问题:

  • 执行程序是每个应用程序 . 那么 Worker 的角色是什么?它是否与执行人协调并将结果传达给司机?或者司机是否与执行人直接对话?如果是这样,那么 Worker 的目的是什么呢?

  • 如何控制应用程序的执行程序数量? 3.可以在执行程序内并行执行任务吗?如果是这样,如何配置执行程序的线程数?

  • 工作者,执行者和执行者核心(--total-executor-cores)之间的关系是什么?

  • 每个节点拥有更多 Worker 意味着什么?

Updated

让我们举个例子来更好地理解 .

Example 1: 具有5个工作节点的独立群集(每个节点具有8个核心)当我使用默认设置启动应用程序时 .

Example 2 与示例1相同的群集配置,但我使用以下设置运行应用程序--executor-cores 10 --total-executor-cores 10 .

Example 3 与示例1相同的群集配置,但我运行具有以下设置的应用程序--executor-cores 10 --total-executor-cores 50 .

Example 4 与示例1相同的群集配置,但我使用以下设置运行应用程序--executor-cores 50 --total-executor-cores 50 .

Example 5 与示例1相同的群集配置,但我运行具有以下设置的应用程序--executor-cores 50 --total-executor-cores 10 .

在每个例子中,有多少执行者?每个执行者有多少个线程?多少个核心?每个申请的执行人数如何决定 . 它总是与 Worker 数量相同吗?

1 回答

  • 191

    enter image description here

    Spark使用主/从架构 . 正如您在图中所看到的,它有一个中央协调器(Driver),它与许多分布式工作器( Actuator )进行通信 . 驱动程序和每个执行程序都在自己的Java进程中运行 .

    DRIVER

    驱动程序是main方法运行的过程 . 首先,它将用户程序转换为任务,然后在执行程序上安排任务 .

    EXECUTORS

    执行程序是工作节点的进程,负责在给定的Spark作业中运行各个任务 . 它们在Spark应用程序的开头启动,通常在应用程序的整个生命周期内运行 . 一旦他们运行任务,他们就会将结果发送给驱动程序 . 它们还为RDD提供内存存储,这些RDD由用户程序通过块管理器缓存 .

    APPLICATION EXECUTION FLOW

    考虑到这一点,当您使用spark-submit向集群提交应用程序时,这就是内部发生的情况:

    • 独立应用程序启动并实例化 SparkContext 实例(只有当您可以将应用程序称为驱动程序时) .

    • 驱动程序向集群管理器请求资源以启动执行程序 .

    • 集群管理器启动执行程序 .

    • 驱动程序进程在用户应用程序中运行 . 根据RDD上的操作和转换,任务将发送给执行程序 .

    • 执行程序运行任务并保存结果 .

    • 如果任何工作程序崩溃,其任务将被发送到不同的执行程序以再次处理 . 在书"Learning Spark: Lightning-Fast Big Data Analysis"中,他们讨论了Spark和Fault Tolerance:

    Spark通过重新执行失败或慢速任务来自动处理故障或慢速计算机 . 例如,如果运行map()操作分区的节点崩溃,Spark将在另一个节点上重新运行它;即使节点没有崩溃但速度比其他节点慢得多,Spark也可以抢先在另一个节点上启动任务的“推测”副本,并在结束时获取结果 .

    • 使用来自驱动程序的SparkContext.stop()或者如果main方法退出/崩溃,则所有执行程序都将终止,集群管理器将释放集群资源 .

    YOUR QUESTIONS

    • 启动执行程序时,它们会自动注册驱动程序,然后直接进行通信 . 工作人员负责向集群管理器传达其资源的可用性 .

    • 在YARN集群中,您可以使用--num-executors执行此操作 . 在独立群集中,除非您使用spark.executor.cores并且一个worker有足够的内核来容纳多个执行程序,否则每个worker将获得一个执行程序 . (正如@JacekLaskowski指出的那样,-num-executors不再在YARN中使用https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66

    • 您可以使用--executor-cores为每个执行程序分配核心数

    • --total-executor-cores是每个应用程序的最大执行程序核心数

    • 正如肖恩欧文所说thread:"there's not a good reason to run more than one worker per machine" . 你会有很多例如,JVM坐在一台机器上 .

    UPDATE

    我无法测试这种情况,但根据文档:

    EXAMPLE 1: Spark将贪婪地获得调度程序提供的核心和执行程序 . 所以最后你会得到5个 Actuator ,每个 Actuator 有8个核心 .

    EXAMPLE 2 to 5: Spark将无法在单个工作程序中分配尽可能多的内核,因此不会启动任何执行程序 .

相关问题