spark:在不丢失数据的情况下将数据写入正在读取的位置

e4eetjau  于 2021-05-26  发布在  Spark
关注(0)|答案(1)|浏览(398)

请帮助我了解如何使用emr和s3将数据写入正在读取的位置,而不会产生任何问题。所以我需要读取分区数据,找到旧数据,删除它,写回新数据,我在这里考虑两种方法:
读取所有数据,应用筛选器,使用save选项savemode.overwrite写回数据。我在这里看到了一个主要问题—在写入之前,它将删除s3中的文件,因此如果emr集群在删除之后但在写入之前由于某种原因宕机—所有数据都将丢失。我可以使用动态分区,但这意味着在这种情况下,我将丢失1个分区的数据。
与上面相同,但写入temp目录,然后删除original,将所有内容从temp移到original。但由于这是s3存储,它没有移动操作,所有文件都将被复制,这可能有点昂贵(我将使用200gb的数据)。
spark的工作原理是不是有别的方法或者我错了?

jm81lzqq

jm81lzqq1#

你没有错。从emr/hadoop上的表中删除记录的过程在您描述的方式中是痛苦的。失败的作业、小文件、分区交换、缓慢的元数据操作会变得更加混乱。。。
有几种格式和文件协议可以在存储s3的表上添加事务功能。开阔的三角洲湖(https://delta.io/)格式,支持事务性删除、更新、合并/上插,而且做得很好。你可以像你描述的那样阅读和删除(比如出于gdpr的目的)。你将有一个事务日志来跟踪你所做的事情。
在第二点,只要你有一个合理的文件,你的成本应该是适度的,数据费用约为23美元/tb/月。然而,如果你结束了太多的小文件,那么api成本列出的文件,获取文件可以加起来很快。托管增量(来自databricks)将通过压缩、数据缓存、数据跳过和z排序来帮助加快表上的许多操作
免责声明,我为databricks工作。。。。

相关问题