[当我运行使用Dataproc Cluster Web界面的Jupyter Notebook创建的PySpark代码时,我发现正在运行的代码并没有使用主节点或工作节点中的所有资源。它仅使用其中的一部分。我在这里回答“将调度程序属性更改为FIFO”时找到了解决此问题的方法。
我在这里有两个问题:1)如何更改计划程序属性?2)除了更改Scheduler属性以外,是否还有其他方法可以使PySpark使用所有资源?
预先感谢
[spark.executor.cores
-每个执行程序的CPU线程数。
spark.executor.memory
-为每个执行程序分配的内存量。spark.dynamicAllocation.enabled=true
-启用动态分配。这样,Spark执行者的数量就可以根据工作需求进行扩展。spark.default.parallelism
-配置作业的默认并行度。除了存储分区方案之外,此属性是为给定作业正确设置的最重要属性。spark.sql.shuffle.partitions
-与spark.default.parallelism
相似,但用于Spark SQL聚合操作。spark.default.parallelism
和spark.sql.shuffle.partitions
,您极有可能不想触摸以上任何内容(除非您在代码中设置了显式的RDD分区计数)。配置YARN和Dataproc上的Spark,以便(如果没有其他作业在运行)给定的Spark作业将占用所有工作线程核心和(大部分)工作内存。 (某些内存仍保留用于系统资源。)spark.default.parallelism
设置得足够高,并且集群利用率仍然很低,那么您的工作可能不够大,无法使用这些资源或您的输入数据集不能充分分割。
请注意,如果您使用HDFS或GCS(Google云存储)进行数据存储,则默认块大小分别为64 MiB或128 MiB。输入数据不会超出块大小,因此您的初始并行度(分区计数)将限制为data_size / block_size
。没有更多的执行者核心而不是分区是没有意义的,因为那些多余的执行者将无事可做。