Apache 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流读卡器,可以从WebSocket读取数据。我将尝试Spark结构化流媒体


如何在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