lea*_*man 198 distributed-computing apache-spark
我阅读了Cluster Mode Overview,但仍然无法理解Spark Standalone集群中的不同进程和并行性.
工作者是否是JVM进程?我跑了bin\start-slave.sh,发现它产生了工人,实际上是一个JVM.
根据上面的链接,执行程序是为运行任务的工作节点上的应用程序启动的进程.Executor也是一个JVM.
这些是我的问题:
执行者是每个应用程序.那么工人的角色是什么?它是否与执行人协调并将结果传达给司机?或者司机是否与执行人直接对话?如果是这样,那么工人的目的是什么呢?
如何控制应用程序的执行程序数量?3.可以在执行程序内并行执行任务吗?如果是这样,如何配置执行程序的线程数?
工作者,执行者和执行者核心(--total-executor-cores)之间的关系是什么?
每个节点拥有更多工人意味着什么?
更新
让我们举个例子来更好地理解.
示例1: 具有5个工作节点的独立群集(每个节点具有8个核心)当我使用默认设置启动应用程序时.
示例2 与示例1相同的集群配置,但我运行具有以下设置的应用程序--executor-cores 10 --total-executor-cores 10.
示例3 与示例1相同的集群配置,但我运行具有以下设置的应用程序--executor-cores 10 --total-executor-cores 50.
示例4 与示例1相同的集群配置,但我运行具有以下设置的应用程序--executor-cores 50 --total-executor-cores 50.
示例5 与示例1相同的集群配置,但我运行具有以下设置的应用程序--executor-cores 50 --total-executor-cores 10.
在每个例子中,有多少执行者?每个执行程序有多少个线程?多少个核心?如何根据申请决定执行人数.它总是与工人数量相同吗?
Mar*_*rco 250
Spark使用主/从架构.正如您在图中所看到的,它有一个中央协调器(Driver),它与许多分布式工作器(执行器)进行通信.驱动程序和每个执行程序都在自己的Java进程中运行.
DRIVER
驱动程序是主方法运行的过程.首先,它将用户程序转换为任务,然后在执行程序上安排任务.
遗嘱执行人
执行程序是工作节点的进程,负责在给定的Spark作业中运行各个任务.它们在Spark应用程序的开头启动,通常在应用程序的整个生命周期内运行.一旦他们运行任务,他们就会将结果发送给驱动程序.它们还为RDD提供内存存储,这些RDD由用户程序通过Block Manager缓存.
应用程序执行流程
考虑到这一点,当您使用spark-submit向集群提交应用程序时,这就是内部发生的情况:
SparkContext实例(只有当您可以将应用程序称为驱动程序时).Spark通过重新执行失败或慢速任务来自动处理故障或慢速计算机.例如,如果运行map()操作分区的节点崩溃,Spark将在另一个节点上重新运行它; 即使节点没有崩溃但速度比其他节点慢得多,Spark也可以抢先在另一个节点上启动任务的"推测"副本,并在结束时获取结果.
你的问题
启动执行程序时,它们会向驱动程序注册,然后直接进行通信.工作人员负责向集群管理器传达其资源的可用性.
在YARN集群中,您可以使用--num-executors执行此操作.在独立群集中,除非您使用spark.executor.cores并且一个worker有足够的内核来容纳多个执行程序,否则每个worker将获得一个执行程序.(正如@JacekLaskowski指出的那样, - 在YARN中不再使用--num-executors https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66)
您可以使用--executor-cores为每个执行程序分配核心数
--total-executor-cores是每个应用程序的最大执行程序核心数
肖恩欧文在此表示线程:"有没有一个很好的理由来运行每台机器多个工作".例如,你可以在一台机器上安装许多JVM.
UPDATE
我无法测试这种情况,但根据文档:
例1: Spark将贪婪地获得调度程序提供的核心和执行程序.所以最后你会得到5个执行器,每个执行器有8个核心.
示例2到5: Spark将无法分配单个工作程序中所请求的核心数,因此不会启动任何执行程序.
| 归档时间: |
|
| 查看次数: |
71564 次 |
| 最近记录: |