【问题标题】:pyspark java.lang.OutOfMemoryError: GC overhead limit exceededpyspark java.lang.OutOfMemoryError:超出 GC 开销限制
【发布时间】:2020-07-24 10:55:55
【问题描述】:

我正在尝试使用 spark 处理 10GB 的数据,这给了我这个错误,

java.lang.OutOfMemoryError:超出 GC 开销限制

笔记本电脑配置为:4CPU、8 个逻辑核心、8GB RAM

在提交 Spark 作业时进行 Spark 配置。

spark = SparkSession.builder.master('local[6]').config("spark.ui.port", "4041").appName('test').getOrCreate()
spark.conf.set("spark.executor.instances", 1)
spark.conf.set("spark.executor.cores", 5)

在网上搜索了有关此错误的信息后,我有几个问题

如果得到回答,那将是一个很大的帮助。

1) Spark是内存计算引擎,处理10gb的数据,系统需要10+gb的RAM。 Spark 将 10gb 数据加载到 10+ gb RAM 内存中,然后执行此工作?

2) 如果第 1 点是正确的,那么大公司是如何处理 100 TB 的数据,他们是通过集群多个系统来处理 100 TB 的数据,形成 100+TB 的 RAM,然后处理 100 TB 的数据?

3) 他们没有其他方法可以通过设置适当的 spark 配置来处理具有 8gb RAM 和 8Cores 的 50gb 数据吗?如果是什么方式,火花配置应该是什么。

4) 如果系统属性是 8gb RAM 和 8 核,那么理想的 spark 配置应该是什么?用于处理 8gb 数据

spark 配置在 spark config 中定义。

spark = SparkSession.builder.master('local[?]').config("spark.ui.port", "4041").appName('test').getOrCreate()
spark.conf.set("spark.executor.instances", ?)
spark.conf.set("spark.executor.cores", ?)

spark.executors.cores = ?

spark.executors.memory = ?

spark.yarn.executor.memoryOverhead =?

spark.driver.memory =?

spark.driver.cores =?

spark.executor.instances =?

核心实例数 =?

spark.default.parallelism =?

【问题讨论】:

  • 问题可能出在您的代码上,而不是您的配置或集群资源上。通常情况下,您会因为不必要地将数据收集到单个节点或驱动程序上而收到此 OOM 错误。请发布您的代码并指出导致错误的操作/操作。
  • 这取决于您的代码做什么以及您的数据如何拆分(是一个大小为 10Gb 的文件?还是拆分成小文件?)。

标签: apache-spark pyspark


【解决方案1】:

如果不能澄清一切,我希望以下内容会有所帮助。

1) Spark 是一个内存计算引擎,要处理 10 GB 的数据,系统应该有 10+gb 的 RAM。 Spark 将 10gb 数据加载到 10+ GB RAM 内存中,然后执行这项工作?

Spark 是一个内存计算引擎,从底层数据湖或分布式存储系统获取输入/源。 10Gb 文件将被分解成更小的块(基于 Hadoop 的数据湖的块大小为 128Mb 或 256Mb),Spark Driver 将获得许多执行程序/核心来从集群的工作节点读取它们。如果您尝试使用笔记本电脑或单个节点加载 10Gb 数据,它肯定会出现内存不足。在处理之前,它必须将所有数据加载到一台机器或许多从属/工作节点中。

2) 如果第 1 点是正确的,那么大公司是如何处理 100 TB 的数据,他们是通过集群多个系统来处理 100 TB 的数据,形成 100+TB 的 RAM,然后处理 100 TB 的数据?

大数据处理项目设计存储和访问层有很多设计模式。他们根本不会将 GB 或 TB 的数据转储到 HDFS 等文件系统。他们使用分区(如销售交易数据按月/周/天分区),对于结构化数据,有不同的文件格式可用(尤其是列式),这有助于仅加载处理所需的那些列。所以正确的文件格式、分区和压缩是大文件的关键属性。

3) 他们没有其他方法可以通过设置适当的 spark 配置来处理具有 8gb RAM 和 8Cores 的 50gb 数据吗?如果是什么方式,火花配置应该是什么。

如果没有分区,则不太可能,但有办法。这也取决于它是什么类型的文件。您可以创建一个可以读取逻辑块并对其进行处理的自定义流文件阅读器。但是,企业不会读取一个文件的50Gb,这是一个单元。即使你通过 Office 工具在你的机器中加载一个 10Gb 的 excel 文件,它也会出现内存不足的情况。

4) 如果系统属性是 8gb RAM 和 8 核,那么理想的 spark 配置应该是什么?用于处理 8gb 数据

为操作系统留出 1 个核心和 1-Gb 或 2-GB,其余的用于处理。现在取决于正在执行哪种转换,您必须决定驱动程序和工作进程的内存。您的驱动程序应该有 2Gb 的 RAM。但笔记本电脑主要用于游乐场探索代码语法​​,不适合大型数据集。最好使用 dataframe.sample() 构建您的逻辑,然后将代码推送到更大的机器以生成输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2020-09-08
    • 1970-01-01
    • 2019-06-29
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多