Apache spark 如何创建自定义流数据源?
我有一个定制的Spark流读卡器,可以从WebSocket读取数据。我将尝试Spark结构化流媒体Apache spark 如何创建自定义流数据源?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我有一个定制的Spark流读卡器,可以从WebSocket读取数据。我将尝试Spark结构化流媒体 如何在Spark Structured streaming中创建流数据源?流数据源实现 org.apache.spark.sql.execution.streaming.Source的scaladoc应该为您提供足够的信息以开始使用(只需按照类型开发可编译的Scala类型) 一旦你有了源代码,你就必须注册它,这样你就可以使用数据流阅读器的格式。使流媒体源可用以便您可以将其用于格式的诀窍是通过为流媒
如何在Spark Structured streaming中创建流数据源?流数据源实现
org.apache.spark.sql.execution.streaming.Source的scaladoc应该为您提供足够的信息以开始使用(只需按照类型开发可编译的Scala类型)
一旦你有了源代码
,你就必须注册它,这样你就可以使用数据流阅读器的格式
。使流媒体源可用以便您可以将其用于格式
的诀窍是通过为流媒体源创建数据源注册表
来注册它。您可以在以下内容中找到示例:
该文件将格式的短名称链接到实现
在我的Spark研讨会上,我通常建议人们从两个方面开始开发:
编写流式查询(使用格式
),例如
最后一步是为自定义源注册DataSourceRegister
实现,该步骤是可选的,仅用于注册最终用户在方法中使用的数据源别名
格式(来源:字符串):DataFrameReader
指定输入数据源格式
查看的代码以获得良好的开端。随着Spark向V2 API的迁移,您现在必须实现和
这将涉及到创建自己的Offset
、MicroBatchReader
、DataReader
和DataReaderFactory
实现
网上有一些定制的结构化流媒体示例(在Scala中),它们对我编写我的示例很有帮助
一旦实现了自定义源代码,就可以按照Jacek Laskowski的答案注册源代码
此外,根据您将从套接字接收的消息的编码,您可以只使用默认套接字源并使用自定义映射函数将信息解析为您将使用的任何bean。尽管请注意Spark说默认的套接字流媒体源不应该在生产中使用
希望这有帮助 也是一个自定义WebSocket流读写器的示例实现,它实现了Offset、MicroBatchReader、DataReader
和DataReaderFactory
其中org.apache.spark.sql.execution.streaming.FileStreamSource
已注册?@lfk添加了更多关于注册步骤的解释。如果还不清楚,请告诉我。谢谢。TextFileFormat
例如实现了DataSourceRegister
,但不是Source
。实际的Source
由DataSource.createSource
创建,对于FileFormat
的所有实例,它是FileStreamSource
(DataSource.scala行265,spark-sql_2.11)。我可以实现DataSourceRegister
,但我仍然不明白如何使用自定义Source
实例。为什么您认为TextFileFormat
负责文本文件的流式数据集?它仅用于批处理/非流式数据集。查看FileStreamSource
(以及注册它的DataSource.createSource
)。为什么不使用DataSourceRegister
实现Source
?我尝试实现Source
和DataSourceRegister
。代码失败,出现java.lang.UnsupportedOperationException:数据源测试不支持流式读取
。检查DataSource.scala:275
。它需要实现StreamSourceProvider
而不是Source
。这当然是V1。V2数据源遵循不同的代码路径。
org.apache.spark.sql.execution.datasources.csv.CSVFileFormat
org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider
org.apache.spark.sql.execution.datasources.json.JsonFileFormat
org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat
org.apache.spark.sql.execution.datasources.text.TextFileFormat
org.apache.spark.sql.execution.streaming.ConsoleSinkProvider
org.apache.spark.sql.execution.streaming.TextSocketSourceProvider
org.apache.spark.sql.execution.streaming.RateSourceProvider
val input = spark
.readStream
.format("yourCustomSource") // <-- your custom source here
.load
$ cat META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
com.mycompany.spark.MyDataSourceRegister