在SO上被问过与核心与执行者有关的问题。
Apache Spark: The number of cores vs. the number of executors
由于每种情况都不同,我再次问类似的问题。
我正在运行一个CPU密集型应用程序,该应用程序具有相同数量的内核以及不同的执行程序。以下是观察结果。
资源管理器: Kubernetes
情况1::执行程序-6,每个执行程序的核心数量-2,执行程序内存-3g,数据处理量〜10GB,分区-36,作业时间: 75分钟
情况2::执行程序-4,每个执行程序的核心数量-3,执行程序内存-3g,数据处理量〜10GB,分区-36,作业时间: 101分钟
根据上述链接,每个执行者少于5个内核的任何对象都适合IO操作。
在我的两个案例中,核心都是相同的(12),但是两个作业花费的时间不同。有什么想法吗?
已更新
情况3::执行程序-12,每个执行程序的核心数量-1,执行程序内存-3g,数据处理量〜10GB,分区-36,作业时间: 81分钟
答案 0 :(得分:1)
有许多可能的解决方案, 首先,并非所有节点的诞生都是平等的,这可能是不幸的工作和较慢的节点之一。 如果您执行具有更多节点但具有相同计算能力的混洗操作,则每秒会真正减慢您的工作。毕竟,在随机操作中,所有信息最终都将存储在单个节点上。事先使该节点具有较少的数据和较少的功率会降低操作速度。 但是我怀疑即使不进行随机操作,更多的节点也会慢一些,因为单个节点有更多的工作要做于其他节点。
说明:
让我们说我有一个节点,10个小时的工作和10个内核,所以我知道这将花费1个小时 但是,如果我有2个节点,每个节点有5个核心,并且可以说数据集以一个节点有5.5个小时的工作而其他节点有4.5个小时的工作的方式进行分区,则工作长度将是1.1个小时。
对于分布式计算,总会有开销的代价。因此通常在一台机器上使用相同资源进行处理通常会更快。
希望我想说的很清楚。
答案 1 :(得分:1)
在第一种情况下,您确实可以使用50%以上的内存(3g * 6 = 18g),而锁定问题更少(2个核心/执行器,而不是3个)。尝试使用1core / executor进行动态分配,看看会发生什么情况