Scala 如何使用Spark结构化流媒体连续监视目录
我希望spark能够持续监视一个目录,并在该目录中出现文件后立即使用Scala 如何使用Spark结构化流媒体连续监视目录,scala,apache-spark,spark-structured-streaming,Scala,Apache Spark,Spark Structured Streaming,我希望spark能够持续监视一个目录,并在该目录中出现文件后立即使用spark.readStream读取CSV文件 请不要包括火花流的解决方案。我正在寻找一种使用spark结构化流媒体的方法。如官方所述,您应该使用“文件”来源: 文件源-读取作为数据流写入目录中的文件。支持的文件格式有文本、csv、json和拼花。请参阅DataStreamReader界面的文档,以了解更为最新的列表以及每种文件格式支持的选项。请注意,文件必须以原子方式放置在给定的目录中,在大多数文件系统中,可以通过文件移动操作
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.schemaInference","true")
您的spark课程在哪里。我有个问题。这也适用于读取avro文件吗?这是否也支持谷歌云存储,即我希望类似地处理我的gcs存储桶中出现的新文件?。此方法是否具有容错性,即如果管道失败,如何恢复,如何知道处理了哪些文件以及哪些是新文件?对于text/json,如果我的流式管道失败,新的流媒体管道如何知道从何处开始使用文件?如何告知spark是否正在写入文件,并等待文件写入操作完成。但是,从实现到spark如何确定新文件?它是否以递归方式列出所有文件并与以前的记忆状态进行比较?如果是这样,处理庞大的文件层次结构将非常低效,对吗?在阅读一些源代码后,spark确实会读取整个文件夹(如果没有提供元数据),然后与以前的状态进行比较,请参阅source class
FileStreamSource.scala
。