【发布时间】:2018-06-25 07:22:46
【问题描述】:
我正在编写一个 Spark Streaming 应用程序,其中输入数据以小批量方式放入 S3 存储桶中(使用数据库迁移服务 - DMS)。 Spark 应用程序是唯一的消费者。我正在考虑两种可能的架构:
- 让 Spark Streaming 监视 S3 前缀并在新对象出现时拾取它们 进来
- 将数据从 S3 流式传输到 Kinesis 流(通过 DMS 创建新 S3 对象时触发的 Lambda 函数)并将流用作 Spark 应用程序的输入。
虽然第二种解决方案可行,但第一种解决方案更简单。但是有什么陷阱吗?看this guide,具体关注两点:
目录下的文件越多,扫描更改所需的时间就越长——即使没有文件被修改。
我们将无限期保留 S3 数据。所以被监控的前缀下的对象数量会很快增加。
“完整”文件系统(如 HDFS)倾向于在创建输出流后立即对其文件设置修改时间。打开文件时,即使在数据完全写入之前,它也可能包含在 DStream 中 - 之后在同一窗口中对文件的更新将被忽略。也就是说:可能会错过更改,并且可能会从流中省略数据。
我不确定这是否适用于 S3,因为据我了解,对象是原子创建的,并且不能像普通文件那样在事后更新。
【问题讨论】:
标签: amazon-web-services apache-spark amazon-s3 spark-streaming amazon-kinesis