【发布时间】: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