【问题标题】:How to resolve GC overhead in pyspark Databricks如何解决 pyspark Databricks 中的 GC 开销
【发布时间】:2020-07-11 18:59:40
【问题描述】:

我正在尝试在 spark 数据框中加载一个 100 GB 的 json 文件并在其上创建一个临时视图。然后我用 query 查询这个视图中的数据

select * from <table_view> limit 1;

但是查询没有完成,而是给出了错误Caused by : java.lang.OutOfMemoryError: GC Overhead limit exceeded. 我正在databricks 集群中运行我的代码。这是我的集群详细信息:

Cluster Mode : standard
Databricks runtime Version : 6.1(Apache Spark 2.4.4)
Worker Type : 56 GB Memory, 16 cores 3 DBU (min worker= 2, max worker = 8) 
Driver Type : 56 GB Memory, 16 cores 3 DBU

我尝试设置以下配置参数,但没有成功。

spark.conf.set("spark.executor.memory", '50g')
spark.conf.set('spark.executor.cores', '5')
spark.conf.set('spark.cores.max', '16')
spark.conf.set("spark.driver.memory",'30g')
spark.conf.set("spark.yarn.executor.memoryOverhead",4096)

我对 apache spark 很陌生。如果需要其他详细信息,请告诉我。

【问题讨论】:

    标签: java apache-spark pyspark garbage-collection azure-databricks


    【解决方案1】:

    您很可能没有足够的资源将整个文件加载为数据框。我看到了两个选项。

    1. 在读取 json 并在这个较小的数据帧上创建表视图后,通过限制行数来创建一个临时数据帧。例如。如果您只想读取 1000 行,请执行以下操作:small_df = entire_df.limit(1000),然后在 small_df 之上创建视图。
    2. 您可以增加集群资源。我从未使用过 Databricks 运行时,但您很可能需要增加工作节点的数量。我建议使用更多内存更少的执行器,而不是使用很少的笨重的执行器。这会给你更多的并行性。

    还有一件事。默认情况下,spark 使用 200 个随机分区。因此,在您的情况下,每个分区将包含大约 0.5GB 的数据。通过增加分区数量(例如 1000)来降低这一侧可能是一个更好的主意。可以通过设置spark.conf.set("spark.sql.shuffle.partitions", 1000)来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2020-07-24
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多