我们在YARN ec2集群中部署了一个火花流媒体应用程序,其中包含1个名称节点和2个数据节点。我们提交的应用程序包含11个执行程序,每个执行程序包含1个核心和588 MB RAM。 应用程序从S3中的目录流式传输,该目录不断被写入;这是实现这一目标的代码行:
val ssc = new StreamingContext(sparkConf, Seconds(10))
val lines = ssc.fileStream[LongWritable, Text, TextInputFormat](Settings.S3RequestsHost , (f:Path)=> true, true )
//some maps and other logic here
ssc.start()
ssc.awaitTermination()
使用fileStream而不是textFileStream的目的是自定义spark在进程启动时处理现有文件的方式。我们只想处理启动过程后添加的新文件,并省略现有文件。我们将批处理持续时间配置为10秒。
当我们向s3添加少量文件时,这个过程很顺利,比方说4或5.我们可以在流式UI中看到如何在执行程序中成功执行各个阶段,每个文件对应一个处理的文件。但有时当我们尝试添加大量文件时,我们会遇到一种奇怪的行为;应用程序启动已经流式传输的流文件。
例如,我向s3添加了20个文件。这些文件分3批处理。第一批处理7个文件,第二批8个和第三批5.此时不再向S3添加文件,但是火花开始用相同的文件无休止地重复这些阶段! 有什么想法会导致这种情况吗?
我发布了此问题的Jira票证: https://issues.apache.org/jira/browse/SPARK-3553
答案 0 :(得分:1)
请注意句子“必须通过原子移动或将数据重命名为数据目录”在Spark Streaming Programming Guide中在dataDirectory中创建文件。整个文件必须一次显示,而不是将文件创建为空并附加到文件中。
一种方法是让cloudberry将文件放在其他位置,然后定期运行脚本,将文件移动或重命名到您已连接流媒体应用程序的目录中。