【问题标题】:Determining optimal number of Spark partitions based on workers, cores and DataFrame size根据工作人员、核心和 DataFrame 大小确定最佳 Spark 分区数
【发布时间】: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

鉴于作为设置,我想知道如何确定一些事情。具体来说:

  • numWorkerNodesnumExecutors是什么关系?是否有一些已知/普遍接受的工人与执行者的比例?有没有办法在给定numWorkerNodes(或任何其他输入)的情况下确定numExecutors
  • 是否存在numDFRowsnumPartitions 的已知/普遍接受/最佳比率?如何根据dataFrame 的大小计算“最佳”分区数?
  • 我从其他工程师那里听说,一般的“经验法则”是:numPartitions = numWorkerNodes * numCpuCoresPerWorker,这是真的吗?换句话说,它规定每个 CPU 核心应该有 1 个分区。

【问题讨论】:

    标签: apache-spark spark-dataframe distributed-computing partitioning bigdata


    【解决方案1】:

    是的, 应用程序有 one and only Driver

    numWorkerNodesnumExecutors是什么关系?

    一个worker可以托管多个executor,你可以把它想象成worker是集群的机器/节点,而executor是一个在该worker上运行的进程(在核心中执行)。

    所以`numWorkerNodes

    他们有口粮吗?

    就个人而言,我曾在一个假集群中工作,我的笔记本电脑是驱动程序,同一台笔记本电脑中的虚拟机是工作人员,并且在一个超过 10k 个节点的工业集群中,我没有不需要关心这个,因为似乎 会处理这个问题。

    我只是使用:

    --num-executors 64
    

    当我启动/提交我的脚本时, 我猜想知道它需要召唤多少工人(当然,还要考虑其他参数以及机器的性质)。

    因此,就我个人而言,我不知道任何这样的比例。


    numDFRowsnumPartitions 之间是否存在已知/普遍接受/最佳比率?

    我不知道,但根据经验,您可以依靠 #executors 乘以 #executor.cores 的乘积,然后将其乘以 3 或 4。当然,这是一个 启发式。在 中,它看起来像这样:

    sc = SparkContext(appName = "smeeb-App")
    total_cores = int(sc._conf.get('spark.executor.instances')) * int(sc._conf.get('spark.executor.cores'))
    dataset = sc.textFile(input_path, total_cores * 3)
    

    如何根据DataFrame 的大小计算“最佳”分区数?

    这是一个很好的问题。当然,这很难回答,这取决于您的数据、集群等,但正如我与 here 讨论的那样。

    分区太少,您将拥有大量数据,尤其是在处理 时,从而使您的应用程序处于内存压力之下。

    分区太多,你的 会承受很大的压力,因为必须从 生成的所有元数据都会随着分区数量的增加而显着增加(因为它维护临时文件等) . *

    因此,您也想要为分区数量找到一个最佳位置,这是微调您的应用程序的部分之一。 :)

    “经验法则”是:numPartitions = numWorkerNodes * numCpuCoresPerWorker,是真的吗?

    啊,在看到这个之前,我正在写上面的启发式。所以这已经回答了,但要考虑到 workerexecutor 的区别。


    *我今天刚刚失败了:Prepare my bigdata with Spark via Python,使用太多分区时导致Active tasks is a negative number in Spark UI

    【讨论】:

    • 如果numPartitions仅由numWorkerNodes numCpuCoresPerWorker 确定,则与numDFRows 无关,这意味着如果输入数据集很大,则分区大小很大。这最终会导致OOM问题。不是吗?
    • @fuyi 提出了一个很好的观点。如果我遵循 numPartitions 经验法则,大型数据集将导致我的数据出现 OOM。有人有其他建议吗?
    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多