根据worker,core和DataFrame大小确定Spark分区的最佳数量

时间:2016-09-08 00:57:10

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

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

  • Spark Driver节点(sparkDriverCount
  • Spark群集可用的工作节点数(numWorkerNodes
  • Spark执行程序的数量(numExecutors
  • 由所有工作人员/执行人员同时操作的DataFrame(dataFrame
  • dataFramenumDFRows
  • 中的行数
  • dataFramenumPartitions
  • 上的分区数
  • 最后,每个工作节点上可用的CPU核心数(numCpuCoresPerWorker

相信所有Spark集群都有一个且只有一个 Spark驱动程序,然后是0+个工作节点。如果我错了,请先纠正我!假设我或多或少是正确的,让我们在这里锁定一些变量。假设我们有一个带有1个驱动程序和4个工作节点的Spark集群,每个工作节点上有4个CPU核心(因此总共有16个CPU核心)。所以这里的“给定”是:

sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16

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

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

1 个答案:

答案 0 :(得分:18)

是的,申请已one and only Driver

  

numWorkerNodesnumExecutors之间的关系是什么?

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

所以`numWorkerNodes< = numExecutors'。

  

他们有任何口粮吗?

就个人而言,曾经在一个虚拟集群中工作,我的笔记本电脑是驱动程序,同一台笔记本电脑中的虚拟机是工作人员,在一个> 10k节点的工业集群中,我没有必要关心这一点,因为似乎会照顾到这一点。

我只是使用:

--num-executors 64

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

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

  

numDFRowsnumPartitions是否已知/普遍接受/最佳比率?

我不知道一个,但根据经验,你可以通过#executor.cores依赖#executors的产品,然后将它乘以3或​​4.当然这是启发式< / em>的。在中,它看起来像这样:

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)
  

如何计算最佳&#39;根据{{​​1}}?

的大小划分的分区数

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

分区太少,您将拥有大量数据,特别是当您处理时,这会使您的应用程序处于内存压力状态。

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

所以你想要的是找到分区数量的最佳位置,这是微调你的应用程序的一部分。 :)

  

&#39;经验法则&#39;是:DataFrame,是真的吗?

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

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