Scala 如何使用Spark结构化流媒体连续监视目录

Scala 如何使用Spark结构化流媒体连续监视目录,scala,apache-spark,spark-structured-streaming,Scala,Apache Spark,Spark Structured Streaming,我希望spark能够持续监视一个目录,并在该目录中出现文件后立即使用spark.readStream读取CSV文件 请不要包括火花流的解决方案。我正在寻找一种使用spark结构化流媒体的方法。如官方所述,您应该使用“文件”来源: 文件源-读取作为数据流写入目录中的文件。支持的文件格式有文本、csv、json和拼花。请参阅DataStreamReader界面的文档,以了解更为最新的列表以及每种文件格式支持的选项。请注意,文件必须以原子方式放置在给定的目录中,在大多数文件系统中,可以通过文件移动操作

我希望spark能够持续监视一个目录,并在该目录中出现文件后立即使用
spark.readStream
读取CSV文件

请不要包括火花流的解决方案。我正在寻找一种使用spark结构化流媒体的方法。

如官方所述,您应该使用“文件”来源:

文件源-读取作为数据流写入目录中的文件。支持的文件格式有文本、csv、json和拼花。请参阅DataStreamReader界面的文档,以了解更为最新的列表以及每种文件格式支持的选项。请注意,文件必须以原子方式放置在给定的目录中,在大多数文件系统中,可以通过文件移动操作来实现

代码示例取自文档:

// Read all the csv files written atomically in a directory
val userSchema = new StructType().add("name", "string").add("age", "integer")
val csvDF = spark
  .readStream
  .option("sep", ";")
  .schema(userSchema)      // Specify schema of the csv files
  .csv("/path/to/directory")    // Equivalent to format("csv").load("/path/to/directory")

如果未指定触发器,Spark将尽快读取新文件

以下是此用例的完整解决方案:

如果您在独立模式下运行。您可以通过以下方式增加驱动程序内存:

bin/spark-shell --driver-memory 4G
无需将executor内存设置为独立模式executor在驱动程序中运行

完成@T.Gaweda的解决方案时,请找到以下解决方案:

val userSchema = new StructType().add("name", "string").add("age", "integer")
val csvDF = spark
  .readStream
  .option("sep", ";")
  .schema(userSchema)      // Specify schema of the csv files
  .csv("/path/to/directory")    // Equivalent to format("csv").load("/path/to/directory")

csvDf.writeStream.format("console").option("truncate","false").start()
现在,spark将持续监视指定的目录,一旦您在该目录中添加任何csv文件,您的数据帧操作“csvDF”将在该文件上执行

注意:如果希望spark推断模式,必须首先设置以下配置:

spark.sqlContext.setConf("spark.sql.streaming.schemaInferenc‌​e","true")

您的spark课程在哪里。

我有个问题。这也适用于读取avro文件吗?这是否也支持谷歌云存储,即我希望类似地处理我的gcs存储桶中出现的新文件?。此方法是否具有容错性,即如果管道失败,如何恢复,如何知道处理了哪些文件以及哪些是新文件?对于text/json,如果我的流式管道失败,新的流媒体管道如何知道从何处开始使用文件?如何告知spark是否正在写入文件,并等待文件写入操作完成。但是,从实现到spark如何确定新文件?它是否以递归方式列出所有文件并与以前的记忆状态进行比较?如果是这样,处理庞大的文件层次结构将非常低效,对吗?在阅读一些源代码后,spark确实会读取整个文件夹(如果没有提供元数据),然后与以前的状态进行比较,请参阅source class
FileStreamSource.scala