如何创建自定义流数据源?

时间:2017-12-02 03:10:59

标签: apache-spark spark-structured-streaming

我有一个自定义阅读器,用于从WebSocket读取数据的Spark Streaming。我将尝试使用Spark Structured Streaming。

如何在Spark Structured Streaming中创建流数据源?

3 个答案:

答案 0 :(得分:11)

随着Spark转向V2 API,您现在必须实施DataSourceV2MicroBatchReadSupportDataSourceRegister

这将涉及创建您自己的OffsetMicroBatchReaderDataReader<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工作坊期间通常建议人们从双方开始开发:

  1. 编写流式查询(带format),例如

    format
  2. 实施流媒体val input = spark .readStream .format("yourCustomSource") // <-- your custom source here .load 和相应的Source(可能是同一个班级)

  3. (可选)通过将完全限定的班级名称DataSourceRegister写入DataSourceRegister来注册com.mycompany.spark.MyDataSourceRegister

    META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
  4. 为自定义$ 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>