第一次尝试我可能误解了你的问题......
据我所知,Spark Streaming 只能将转换应用于批处理(映射到 RDD 的 DStream),而不能一次应用于整个文件(当其有限流完成时)。
那是对的吗?
不,这是不正确的。
Spark Streaming 将立即对整个文件应用转换,就像在 Spark Streaming 的批处理间隔过去时写入 HDFS 一样。
Spark Streaming 将获取文件的当前内容并开始处理它。
上传新文件后,我需要使用 Spark/SparkSQL 处理新文件
Spark几乎不可能,因为它的架构从“上传”和 Spark 处理它的那一刻起需要一些时间。
您应该考虑使用全新且闪亮的结构化流式处理或(即将过时的)Spark Streaming。
这两种解决方案都支持监视新文件的目录并在上传新文件后触发 Spark 作业(这正是您的用例)。
引用结构化流的输入源:
在 Spark 2.0 中,有一些内置的源代码。
- 文件源- 将写入目录中的文件作为数据流读取。支持的文件格式为文本、csv、json、parquet。请参阅 DataStreamReader 接口的文档以获取最新列表以及每种文件格式支持的选项。请注意,文件必须以原子方式放置在给定目录中,在大多数文件系统中,这可以通过文件移动操作来实现。
另请参阅 Spark Streaming 的基本来源:
除了套接字之外,StreamingContext API 还提供了从文件作为输入源创建 DStream 的方法。
文件流:为了从与 HDFS API 兼容的任何文件系统(即 HDFS、S3、NFS 等)上的文件读取数据,可以将 DStream 创建为:
streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)
Spark Streaming 将监视目录 dataDirectory 并处理在该目录中创建的任何文件(不支持写入嵌套目录中的文件)。
考虑到您的要求,有一个警告:
我需要知道“文件流”何时完成。
不要对 Spark 执行此操作。
再次引用 Spark Streaming 的Basic Sources:
总结...您应该仅在文件完成并准备好使用 Spark 处理时将文件移动到 Spark 监视的目录。这超出了 Spark 的范围。