【问题标题】:Reading Spark Dataframe from S3 Bucket While Another Process Writes to it?在另一个进程写入时从 S3 存储桶读取 Spark 数据帧?
【发布时间】:2018-09-21 05:04:24
【问题描述】:

读取 spark 数据帧并通过 Jupyter 笔记本和另一个进程同时写入 s3 存储桶来持久化它会不会有任何问题?

说,

我读了一个类似的数据框:

 s3 = spark.read.parquet('s3://path/to/table')

然后在笔记本上做这件事。

同时,我在某个时候通过不同的进程写入同一个 s3 存储桶,例如

system('s3-dist-cp --src --dest s3://path/to/table)

这会成为一个问题吗?我可以搞乱读取/数据帧,但我不想阻止写入存储桶。

【问题讨论】:

    标签: amazon-web-services apache-spark amazon-s3 amazon-emr bucket


    【解决方案1】:

    这将在您读取的第一个 DF 上的任何操作上导致 FNF 异常。

     s3 = spark.read.parquet('s3://path/to/table')
    

    上面涉及的第一个 spark 作业是列出叶文件和目录。由于有另一个进程正在写入/重写数据,因此路径将是陈旧的。

    此外,还应考虑 S3 的最终一致性行为。

    【讨论】:

    • 所以基本上假设我同时提交了一个 GET (spark.read.parquet) 和 PUT (s3-dist-cp)。它将这些放入队列并按顺序执行操作,因此不会发生冲突。然而,因为我们必须考虑最终的一致性模型,我们可能会在我们的读取过程中(而不是稍微之前)或之前写出一些情况。在为该存储桶重新创建缓存之前,我们将拥有数据的先前版本。我认为这是正确的理解?我也不明白这些路径会过时吗?
    • 我已经回答了最后一个问题,看起来是因为我们不能保证新存储桶中的分区/子目录相同,对吧?
    • S3 提供列表不一致:列表通常滞后于文件的创建/删除,这会破坏 Spark,并且更新不一致:如果您覆盖现有文件然后尝试读取它,则读取器可能会获取旧数据. Spark 中没有任何期望
    猜你喜欢
    • 2021-11-17
    • 2020-07-29
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多