如何阻止火花结构化流式传输每次都列出S3存储桶中的所有文件

时间:2018-06-15 14:37:58

标签: apache-spark amazon-s3

我在pyspark上有一个结构化的流媒体作业,可以对文件源进行一些聚合。我有一个kinesis firehose结合来自IoT类型应用程序的数据,并将数据作为每分钟文件存储在S3位置,位于以下文件夹结构的不同文件夹中 -

s3://year/month/day/hour/

我的Spark结构化流媒体作业似乎可以列出我的S3存储桶中可用的所有文件。由于上市过程似乎比我设定的处理时间花费更多时间。我收到以下警告,我想知道是否有办法不让这种情况发生。

18/06/15 14:28:35 WARN ProcessingTimeExecutor: Current batch is falling behind. The trigger interval is 60000 milliseconds, but spent 74364 milliseconds
18/06/15 14:28:42 WARN FileStreamSource: Listed 4449 file(s) in 6822.134244 ms
18/06/15 14:29:06 WARN FileStreamSource: Listed 4449 file(s) in 6478.381219 ms
18/06/15 14:30:08 WARN FileStreamSource: Listed 4450 file(s) in 8285.654031 ms

2 个答案:

答案 0 :(得分:2)

S3 API列表操作只能用于检索共享前缀的存储桶中的所有对象键。因此,仅列出未处理的新对象是根本不可能的。 Databrick的人们似乎拥有a solution,您可以在其中设置S3以在创建新对象时创建SQS记录。然后,Spark检查SQS中是否有新对象,并从S3中检索特定对象(即不涉及任何列表)。不幸的是,此连接器似乎仅在Databricks群集上可用,并且尚未开源,因此,例如,如果您使用EMR,则不能使用它(除非您自己实现连接器)。

答案 1 :(得分:1)

班级FileStreamSource中的评论:

  

//列出文件使用时间超过2秒时输出警告。

因此,要消除此警告,您可以减少每次触发处理的文件数量:

可以在文件源上设置

maxFilesPerTrigger选项以确保它采用< 2秒。

第一个警告是您设置的触发间隔(60000)短于所需的时间(74364)。只需增加触发间隔即可摆脱这种情况。