【发布时间】:2017-01-15 19:15:17
【问题描述】:
在 Spark-land 中有几个相似但不同的概念,围绕着工作如何被分流到不同的节点并同时执行。具体有:
- Spark 驱动程序节点 (
sparkDriverCount) - Spark 集群可用的工作节点数 (
numWorkerNodes) - Spark 执行器的数量 (
numExecutors) - 所有工作人员/执行者同时操作的 DataFrame (
dataFrame) -
dataFrame(numDFRows) 中的行数 -
dataFrame(numPartitions) 上的分区数 - 最后,每个工作节点上可用的 CPU 内核数 (
numCpuCoresPerWorker)
我相信所有 Spark 集群都有 one-and-only-one Spark Driver,然后是 0+ 个工作节点。如果我错了,请从纠正我开始!假设我对此或多或少是正确的,让我们在这里锁定一些变量。假设我们有一个 Spark 集群,有 1 个 Driver 和 4 个 Worker 节点,每个 Worker 节点上有 4 个 CPU 核心(所以总共有 16 个 CPU 核心)。所以这里的“给定”是:
sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16
鉴于作为设置,我想知道如何确定一些事情。具体来说:
-
numWorkerNodes和numExecutors是什么关系?是否有一些已知/普遍接受的工人与执行者的比例?有没有办法在给定numWorkerNodes(或任何其他输入)的情况下确定numExecutors? - 是否存在
numDFRows与numPartitions的已知/普遍接受/最佳比率?如何根据dataFrame的大小计算“最佳”分区数? - 我从其他工程师那里听说,一般的“经验法则”是:
numPartitions = numWorkerNodes * numCpuCoresPerWorker,这是真的吗?换句话说,它规定每个 CPU 核心应该有 1 个分区。
【问题讨论】:
标签: apache-spark spark-dataframe distributed-computing partitioning bigdata