我有一个自定义阅读器,用于从WebSocket读取数据的Spark Streaming。我将尝试使用Spark Structured Streaming。
如何在Spark Structured Streaming中创建流数据源?
答案 0 :(得分:11)
随着Spark转向V2 API,您现在必须实施DataSourceV2,MicroBatchReadSupport和DataSourceRegister。
这将涉及创建您自己的Offset
,MicroBatchReader
,DataReader<Row>
和DataReaderFactory<Row>
的实施。
在线(在Scala中)有一些examples自定义结构化流媒体示例,这对我写作有帮助。
一旦您实施了自定义来源,就可以在注册来源时遵循Jacek Laskowski的回答。
此外,根据您从套接字收到的消息的编码,您可以只使用默认套接字源并使用自定义地图函数将信息解析为您所关注的任何Beans正在使用。虽然请注意Spark说默认套接字流源不应该用于生产!
希望这有帮助!
答案 1 :(得分:5)
流数据源实现org.apache.spark.sql.execution.streaming.Source。
org.apache.spark.sql.execution.streaming.Source
的scaladoc应该为您提供足够的信息以便开始(只需按照类型开发可编译的Scala类型)。
获得Source
后,您必须注册,以便在format
的{{1}}中使用它。使流媒体源可用以便将其用于DataStreamReader
的技巧是通过为流媒体源创建format
来注册它。您可以在META-INF/services/org.apache.spark.sql.sources.DataSourceRegister中找到示例:
DataSourceRegister
这是将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
中的短名称链接到实现的文件。
我在Spark工作坊期间通常建议人们从双方开始开发:
编写流式查询(带format
),例如
format
实施流媒体val input = spark
.readStream
.format("yourCustomSource") // <-- your custom source here
.load
和相应的Source
(可能是同一个班级)
(可选)通过将完全限定的班级名称DataSourceRegister
写入DataSourceRegister
来注册com.mycompany.spark.MyDataSourceRegister
:
META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
为自定义$ cat META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
com.mycompany.spark.MyDataSourceRegister
注册DataSourceRegister
实施的最后一步是可选的,仅用于注册最终用户在DataFrameReader.format方法中使用的数据源别名。
格式(来源:字符串):DataFrameReader 指定输入数据源格式。
查看org.apache.spark.sql.execution.streaming.RateSourceProvider的代码以获得良好的开端。
答案 2 :(得分:0)
Here也是自定义WebSocket流阅读器/编写器的示例实现,该实现实现Offset, MicroBatchReader, DataReader<Row>
和DataReaderFactory<Row>