gpt4 book ai didi

apache-spark - 根据工作线程,内核和DataFrame大小确定Spark分区的最佳数量

转载 作者:行者123 更新时间:2023-12-03 12:15:53 24 4
gpt4 key购买 nike

在Spark-land中,有几个类似但又不同的概念,围绕着如何将工作移植到不同的节点并同时执行。具体来说,有:

  • Spark驱动程序节点(sparkDriverCount)
  • Spark集群(numWorkerNodes)可用的辅助节点数
  • Spark执行程序的数量(numExecutors)
  • 所有工作人员/执行者正在同时操作的DataFrame(dataFrame)
  • dataFrame(numDFRows)
  • 中的行数
  • dataFrame(numPartitions)
  • 上的分区数
  • 最后,每个工作程序节点(numCpuCoresPerWorker)上可用的CPU内核数

  • 我相信所有Spark集群都有一个和唯一的Spark Driver,然后有0+个工作节点。如果我错了,请先纠正我!假设我对此大致上是正确的,我们在这里锁定几个变量。假设我们有一个Spark集群,其中包含1个驱动程序和4个Worker节点,并且每个Worker Node上都具有4个CPU内核(因此共有16个CPU内核)。所以这里的“给定”是:
    sparkDriverCount = 1
    numWorkerNodes = 4
    numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16

    鉴于此设置,我想知道如何确定一些事情。特别:
  • numWorkerNodesnumExecutors之间是什么关系? worker 与遗嘱执行人之间是否有已知/普遍接受的比例?有没有一种方法可以在给定numExecutors(或任何其他输入)的情况下确定numWorkerNodes
  • 是否存在numDFRowsnumPartitions的已知/普遍接受/最佳比率?如何根据dataFrame的大小计算“最佳”分区数?
  • 我从其他工程师那里听说,一般的“经验法则”是:numPartitions = numWorkerNodes * numCpuCoresPerWorker,对此有何道理?换句话说,它规定每个CPU内核应有1个分区。
  • 最佳答案

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

    What is the relationship between numWorkerNodes and numExecutors?



    一个工作程序可以托管多个执行程序,您可以将其视为群集的机器/节点,而该执行程序则是在该工作程序上运行的进程(在内核中执行)。

    因此,“numWorkerNodes <= numExecutors”。

    Is there any ration for them?



    就个人而言,在假集群中工作时,我的笔记本电脑是驱动程序,而在同一台笔记本电脑中的虚拟机是工作人员,并且在节点数超过1万的工业集群中,我不需要担心,因为似乎 会解决这个问题。

    我只用:
    --num-executors 64

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

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

    Is there a known/generally-accepted/optimal ratio of numDFRows to numPartitions?



    我不知道一个,但是根据经验,您可以依靠#executor.cores乘以#executors的乘积,然后将其乘以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)

    How does one calculate the 'optimal' number of partitions based on the size of the DataFrame?



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

    分区太少,您将拥有大量的数据块,尤其是在处理 时,因此使应用程序处于内存紧张状态。

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

    因此,您还想要找到分区数量的最佳选择,这是对应用程序进行微调的部分之一。 :)

    'rule of thumb' is: numPartitions = numWorkerNodes * numCpuCoresPerWorker, is it true?



    啊,我在看到上面之前就在写上面的启发式方法。因此,这已经得到了回答,但要考虑到 worker 与执行者的区别。

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

    关于apache-spark - 根据工作线程,内核和DataFrame大小确定Spark分区的最佳数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381041/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com