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