Spark-land中有几个相似但又不同的概念,围绕着如何将工作转移到不同的节点并同时执行。具体来说,有:
sparkDriverCount
)numWorkerNodes
)numExecutors
)dataFrame
)dataFrame
(numDFRows
)dataFrame
(numPartitions
)numCpuCoresPerWorker
)我相信所有Spark集群都有一个且只有一个 Spark驱动程序,然后是0+个工作节点。如果我错了,请先纠正我!假设我或多或少是正确的,让我们在这里锁定一些变量。假设我们有一个带有1个驱动程序和4个工作节点的Spark集群,每个工作节点上有4个CPU核心(因此总共有16个CPU核心)。所以这里的“给定”是:
sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16
鉴于作为设置,我想知道如何确定一些事情。具体做法是:
numWorkerNodes
和numExecutors
之间的关系是什么?是否有一些已知/普遍接受的工人与遗嘱执行人的比例?有没有办法确定numExecutors
给定numWorkerNodes
(或任何其他输入)?numDFRows
到numPartitions
是否已知/普遍接受/最佳比率?如何根据dataFrame
?numPartitions = numWorkerNodes * numCpuCoresPerWorker
,有什么道理吗?换句话说,它规定每个CPU核心应该有一个分区。答案 0 :(得分:18)
是的,spark申请已one and only Driver。
numWorkerNodes
和numExecutors
之间的关系是什么?
一个worker可以托管多个执行器,你可以把它想象成一个worker作为你的集群的机器/节点,执行器就是一个在该worker上运行的进程(在一个核心中执行)。
所以`numWorkerNodes< = numExecutors'。
他们有任何口粮吗?
就个人而言,曾经在一个虚拟集群中工作,我的笔记本电脑是驱动程序,同一台笔记本电脑中的虚拟机是工作人员,和在一个> 10k节点的工业集群中,我没有必要关心这一点,因为似乎spark会照顾到这一点。
我只是使用:
--num-executors 64
当我启动/提交我的脚本时,spark知道,我想,需要召唤多少工人(当然,还要考虑其他参数,以及机器的性质)。< / p>
因此,就个人而言,我不知道任何这样的比例。
numDFRows
到numPartitions
是否已知/普遍接受/最佳比率?
我不知道一个,但根据经验,你可以通过#executor.cores依赖#executors的产品,然后将它乘以3或4.当然这是启发式< / em>的。在pyspark中,它看起来像这样:
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。
分区太少,您将拥有大量数据,特别是当您处理bigdata时,这会使您的应用程序处于内存压力状态。
分区太多,您的hdfs会承受很大压力,因为随着分区数量的增加,必须从hdfs生成的所有元数据都会显着增加(因为它维护了临时文件)等)。 *
所以你想要的是找到分区数量的最佳位置,这是微调你的应用程序的一部分。 :)
&#39;经验法则&#39;是:
DataFrame
,是真的吗?
啊,在看到这个之前,我正在编写上面的启发式。所以这已经得到了回答,但考虑到 worker 和 executor 的区别。
* 我今天刚刚失败了:Prepare my bigdata with Spark via Python,当使用太多分区导致Active tasks is a negative number in Spark UI。