是的,Spark应用程序只有一个驱动程序。
numWorkerNodes和numExecutors之间的关系是什么?
一个 job者可以承载多个 executor,您可以将其视为集群的机器/节点的 job者,而 executor则是在该 job者上运行的进程(在 core中执行)。
所以“numWorkerNodes<=numExecutors”。
他们有配给吗?
就我个人而言,在一个假集群中 job,我的 Notebook电脑是驱动程序,而在同一台 Notebook电脑中的虚拟机是 workers,在一个超过10万个节点的工业集群中,我不需要关心这一点,因为这似乎是由Spark负责的。
我只是使用:
--num-executors 64
当我启动/提交我的脚本时,Spark知道它需要召集多少 worker(当然,也要考虑到其他参数和机器的性质)。
因此,就我个人而言,我不知道这种比例。
numdrows与numpartitions之间是否存在已知/普遍接受/最佳的比率?
我不知道其中一个,但 root据经验,你可以用 executors的产品乘以 executors的 core,然后再乘以3或4。当然,这是一个启发式的。在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)
如何 root据 DataFrame 的大小计算“最佳”分区数?
这是个很好的问题。当然,这很难回答,这取决于您的数据、集群等,但正如我们在这里与自己讨论的那样。
分区太少,您将拥有大量的数据块,尤其是在处理大数据时,这会使应用程序内存不足。
分区太多,您的 HDFSSS将承受很大的压力,因为必须从 HDFSSS生成的所有元数据都会随着分区数量的增加而显著增加(因为它维护临时文件等)。*
因此,您也需要为分区的数量找到一个最佳位置,这是微调应用程序的一部分。:)
“经验法则”是:numPartitions=numWorkerNodes*numCpucoresPerWorker,是真的吗?
啊,在看到这个之前,我写了上面的启发式。所以这已经被回答了,但是考虑到 worker和 executors的不同。
*今天我失败了:通过python用spark准备我的bigdata,当使用太多的分区时,导致活动任务在spark ui中是负数。