如何使用Spark Streaming更新镶木地板文件?

时间:2019-11-03 14:55:04

标签: apache-spark spark-streaming parquet

我正在使用Spark Streaming建立实时数据管道。 我正在从Kafka获取实时数据,并通过使用Spark处理这些数据。

但是,当我用S3的新传入数据更新S3上的现有镶木地板文件时,其性能将不佳。由于我必须从S3中获取现有的分区镶木地板文件,并用来自Kafka的新记录替换旧记录,然后在S3上覆盖完整的分区镶木地板文件。

因为该表经常更新,所以需要很多时间。

您能建议我在火花流中执行更新操作的更好方法吗?

先谢谢了。

2 个答案:

答案 0 :(得分:0)

当我们说“ parquet file”时,我们真正的意思是目录结构,其中包含多个文件。这些文件的组织方式及其代表的内容取决于分区选项以及其他方面。

要了解的重要一点是,信息更新的单位是一个文件(来自上述目录结构)。因此,如果您在此目录结构中有一个10Gb文件,并且想从一条只有4个字节长的记录中更新一个字段,很抱歉...但是您将不得不覆盖整个记录10Gb文件。

Parquet并非旨在用作数据库,而是像类固醇的CSV一样,如果您允许我使用这种隐喻的话。

为了更新存储为镶木地板的东西,首先需要了解您的数据,了解您的工作流程,以方便的方式对数据进行分区,然后采用某些技术。

我选择了一篇文章,该文章更详细地解释了该问题,并阐述了如何解决这一难题。简而言之,您将使用称为Delta Lake的东西,它基本上是类固醇上的实木复合地板目录结构,具有许多优点。

https://mungingdata.com/delta-lake/merge-update-upserts/

https://delta.io

答案 1 :(得分:-1)

镶木地板格式不允许附加,在任何情况下,如果要向镶木地板文件中添加某些内容,都必须完全覆盖它。在您的情况下,您想更新某些字段,但这只是最糟糕的情况,因为它不是数据库。

解决方法是仅添加信息,如果应该更新一条记录,只需在一行中添加新信息并在处理过程中获取最新信息即可。