Spark流查询两次加载数据源

时间:2018-07-18 22:57:15

标签: apache-spark streaming spark-streaming

我已经针对专有的供应商消息传递系统实施了自己的结构化流数据源。它使用实现MicroBatchReadSupport和DataSourceRegister的结构化流API的V2。我在一些示例found here之后对其进行了建模。我还遵循了this stack overflow post给出的建议。起初,当我在readStream上调用load时,一切似乎都可以正常启动。但是,当我尝试将查询定向到writeStream时,它将尝试实例化另一个MicroBatchReadSupport。实际上这很快就失败了,因为我在createMicroBatchReader方法中进行了检查,以查看是否提供了架构,如果没有,则抛出异常。在第二次调用createMicroBatchReader的情况下,即使初始查询确实提供了一个架构,也没有提供任何架构。我启动流的代码(紧跟在Spark文档中的示例之后)如下所示:

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._

object Streamer {

  def main(args: Array[String]): Unit = {

    val schema = StructType(
      StructField("TradeId", LongType, nullable = True) ::
      StructField("Source", StringTYpe, nullable = True :: Nil
    )

    val spark = SparkSession
      .builder
      .getOrCreate()

    val ampsStream = spark.readStream
      .format("amps")
      .option("topic", "/test")
      .option("server", "SOME_URL")
      .schema(schema)
      .load()

     ampsStream.printSchema()

     val query = ampsStream.writeStream.format("console").start()

     query.awaitTermination()
  }
}

我已经测试了break和debug语句,当我进入writeStream.start时,它再次被调用。如前所述,奇怪的是,第二次传递给createMicroBatchReader的Optional变量为空,因为第一个调用正确包含了模式。任何指导将不胜感激。

编辑:我添加了一些调试语句,并使用上述存储库@ https://github.com/hienluu/wikiedit-streaming对此进行了测试,从该存储库运行WikiEditSourceV2Example.scala时,我看到了完全相同的问题。不知道这是一个错误,还是我和前面提到的回购协议的作者缺少某些东西。

编辑2:为安培流媒体源添加代码 导入java.util.Optional

import org.apache.spark.internal.Logging
import org.apache.spark.sql.sources.DataSourceRegister
import org.apache.spark.sql.sources.v2.reader.streaming.{MicroBatchReader, Offset}
import org.apache.spark.sql.sources.v2.{DataSourceOptions, DataSourceV2, MicroBatchReadSupport}
import org.apache.spark.sql.types.StructType


class AmpsStreamingSource extends DataSourceV2 with MicroBatchReadSupport with DataSourceRegister {

  override def shortName(): String = "amps"

  override def createMicroBatchReader(schema: Optional[StructType],
                                      checkpointLocation: String,
                                      options: DataSourceOptions): MicroBatchReader = {

    println("AmpsStreamingSource.createMicroBatchReader was called")
    if(schema.isPresent) new AmpsMicroBatchReader(schema.get, options)

    throw new IllegalArgumentException("Must proivde a schema for amps stream source")
  }
}

和AmpsMicroBatchReader的签名

class AmpsMicroBatchReader(schema: StructType, options: DataSourceOptions)
    extends MicroBatchReader with MessageHandler with Logging 

0 个答案:

没有答案