更改GCP DataProc群集的调度程序属性

时间:2019-12-01 09:39:18

标签: google-app-engine google-cloud-platform google-cloud-dataproc

当我运行使用Dataproc Cluster Web界面的Jupyter Notebook创建的PySpark代码时,我发现正在运行的代码并未使用主节点或工作节点中的所有资源。它仅使用其中的一部分。我在这里回答“将调度程序属性更改为FIFO”时找到了解决该问题的方法。

我在这里有两个问题: 1)如何更改Scheduler属性?
2)除了更改Scheduler属性以外,是否还有其他方法可以使PySpark使用所有资源?

预先感谢

1 个答案:

答案 0 :(得分:1)

如果您只是想获取更多资源,则不想更改Spark调度程序。相反,您想确保将数据划分为足够的分区,确保有足够的执行程序,并且每个执行程序都具有足够的内存等,以使您的作业正常运行。

Some properties you may want to consider

  • 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.parallelismspark.sql.shuffle.partitions(除非您在代码中设置了显式RDD分区计数)以外,您极有可能不想触摸上述任何内容。配置YARN和Dataproc上的Spark,以便(如果没有其他作业在运行)给定的Spark作业将占用所有工作线程核心和(大部分)工作内存。 (某些内存仍保留用于系统资源。)

如果您已经将spark.default.parallelism设置得足够高并且集群利用率仍然很低,那么您的工作可能不够大,无法使用这些资源 或您的输入数据集无法充分拆分

请注意,如果您将HDFS或GCS(Google云存储)用于数据存储,则默认块大小分别为64 MiB或128 MiB。输入数据不会超出块大小,因此您的初始并行度(分区计数)将限制为data_size / block_size。没有更多的执行者核心而不是分区是没有意义的,因为那些多余的执行者将无事可做。