【问题标题】:Not enough space to cache Dataframe in memory没有足够的空间在内存中缓存 Dataframe
【发布时间】:2019-07-12 19:29:40
【问题描述】:

我需要在我的流应用程序中读取一个文件,并且缓存该文件需要更多时间。所以我试图在 spark-shell 中复制它。

文件大小为 2.7G。我已经启动了驱动内存为 6G 的 spark-shell。但它仍然给我以下警告。我相信缓存文件的延迟是因为这个。知道如何解决这个问题。

 scala> val files = spark.read.parquet("/data/realtime/hierarchy")
 files: org.apache.spark.sql.DataFrame = [geo_hierarchy_base_id: string, postal_code: string ... 11 more fields]

 scala> files.cache
 res2: files.type = [geo_hierarchy_base_id: string, postal_code: string ... 11 more fields]

 scala> files.count
 [Stage 5:================>                                         (8 + 4) / 29]2019-05-10 07:19:14 WARN  MemoryStore:66 - Not enough space to cache rdd_16_8 in memory! (computed 267.0 MB so far)
 2019-05-10 07:19:14 WARN  BlockManager:66 - Persisting block rdd_16_8 to disk instead.
 2019-05-10 07:19:14 WARN  MemoryStore:66 - Not enough space to cache rdd_16_11 in memory! (computed 267.1 MB so far)
 2019-05-10 07:19:14 WARN  MemoryStore:66 - Not enough space to cache rdd_16_9 in memory! (computed 267.0 MB so far)
 2019-05-10 07:19:14 WARN  BlockManager:66 - Persisting block rdd_16_9 to disk instead.
 2019-05-10 07:19:14 WARN  BlockManager:66 - Persisting block rdd_16_11 to disk instead.
 2019-05-10 07:19:14 WARN  MemoryStore:66 - Not enough space to cache rdd_16_10 in memory! (computed 267.0 MB so far)
 2019-05-10 07:19:14 WARN  BlockManager:66 - Persisting block rdd_16_10 to disk instead.
 2019-05-10 07:19:17 WARN  MemoryStore:66 - Not enough space to cache rdd_16_11 in memory! (computed 267.1 MB so far)
 2019-05-10 07:19:18 WARN  MemoryStore:66 - Not enough space to cache rdd_16_8 in memory! (computed 267.0 MB so far)

编辑

我正在尝试将文件缓存在 spark-shell 中。我的输入文件大小为 2.9GB,spark-shell 的驱动程序内存为 10GB。我试图缓存文件。虽然在启动 spark-shell 时提到了 10G,但只为驱动分配了 5.5GB(附上 spark UI)。

我不明白的是,所有的存储内存(5.3GB)和额外的 2.8GB 磁盘都用于缓存 2.9GB 的文件。

能否请您告诉我在我们进行缓存时究竟会发生什么。为什么几乎使用了 3 倍的 RAM。这是因为我的文件格式是 parquet 并且在读入内存时文件会爆炸吗?我试图从中创建一个文本文件只是为了知道文件大小。文本文件大小约为 21GB。

谢谢

谢谢。

【问题讨论】:

  • 0.6 x 0.9 内存规则会将 10gb 扩展到 5.5gb。
  • 感谢您的回复。但是我在 executors 选项卡下只看到驱动程序,没有关于 executors 的其他详细信息。我必须旋转多个执行器,因为读取和缓存大约 2.8 GB 的文件需要更多时间。虽然我已将驱动程序内存设为 16GB,但阅读此内容大约需要 8 分钟。这会导致问题,因为程序的批处理间隔只有 5 分钟。谢谢
  • 你说得对,只能影响线程。
  • 在 yarn 客户端模式下尝试 spark-shell。这就是我对 aws emr 所做的事情
  • 执行器是线程,它们和驱动程序是单个jvm的一部分,所以你有并行性,只是要清楚

标签: apache-spark


【解决方案1】:

使用 org.apache.spark.serializer.KryoSerializer 来最小化 spark 中的内存消耗。

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多