【问题标题】:Spark is throwing FileNotFoundException while accessing cached tableSpark 在访问缓存表时抛出 FileNotFoundException
【发布时间】:2021-08-21 16:50:32
【问题描述】:

我在脚本的早期读取了一个表,但如果在我读取的分区中的基础表发生更改,它将在运行期间失败,例如:

java.io.FileNotFoundException: File does not exist:
hdfs://R2/projects/.../country=AB/date=2021-08-20/part-00005e4-4fa5-aab4-93f02feaf746.c000

即使我专门缓存表并执行操作,如果发生上述情况,脚本仍然会失败。

df.cache()
df.show(1)

我的问题是,这怎么可能?
如果我将数据缓存在内存/磁盘上,为什么底层文件是否更新很重要?

编辑:代码很长,主要是:

  1. df=读入表,其底层数据在上述HDFS文件夹中

  2. df。 cache() 和 df.show() 紧随其后,因为 Spark 是惰性计算的。使用 show() 进行缓存

  3. 稍后当我参考 df: 如果基础数据发生更改,脚本将失败并出现 java.io.FileNotFoundException:

     new_df= df.join(
     other_df, 'id', 'right')
    

【问题讨论】:

  • 您能否提供有关您正在运行的代码的更多信息? Spark 由不立即计算的惰性转换组成,这可能会误导您对数据实际发生的情况。关于here的更多信息。
  • 这就是为什么我在缓存后立即执行操作,以确保执行缓存。
  • 抛出异常的那一行是什么?
  • 已添加,正好加入
  • Spark 会在内存不足时自动驱逐缓存的数据。在 join 条件上方放置一个 sleep 语句并检查 spark UI-storage 选项卡并验证缓存数据是否仍然可用。

标签: apache-spark pyspark


【解决方案1】:

正如评论部分所讨论的,每当遇到内存不足的问题时,Spark 都会根据 LRU(最近使用的租约)概念自动驱逐缓存的数据。

在您的情况下,spark 可能已经驱逐了缓存表。如果没有缓存数据,则将使用先前的沿袭再次形成数据帧,如果基础文件丢失,则会引发错误。

您可以尝试增加内存或将存储级别用作 DISK_ONLY。

 df.persist(StorageLevel.DISK_ONLY)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多