Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark streaming query两次加载数据源_Apache Spark_Streaming_Spark Streaming - Fatal编程技术网

Apache spark Spark streaming query两次加载数据源

Apache spark Spark streaming query两次加载数据源,apache-spark,streaming,spark-streaming,Apache Spark,Streaming,Spark Streaming,我已经在spark中实现了我自己的结构化流数据源,与专有的供应商消息传递系统相对应。它使用结构化流式API的V2实现MicroBatchReadSupport和DataSourceRegister。我在很大程度上模仿了一些例子。我也听从了在会议上提出的建议。起初,当我在readStream上调用load时,一切似乎都正常启动。但是,当我尝试将查询定向到writeStream时,它尝试实例化另一个MicroBatchReadSupport。这实际上很快就会失败,因为我在createMicroBat

我已经在spark中实现了我自己的结构化流数据源,与专有的供应商消息传递系统相对应。它使用结构化流式API的V2实现MicroBatchReadSupport和DataSourceRegister。我在很大程度上模仿了一些例子。我也听从了在会议上提出的建议。起初,当我在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()
  }
}
我将中断和调试语句放入测试中,当我到达writeStream.start时,它会再次被调用。如前所述,奇怪的是,第二次传入createMicroBatchReader的可选变量为空,第一次调用正确地使用了模式。任何指导都将不胜感激

编辑:我添加了一些调试语句,并用上面提到的repo@对其进行了测试,在从该repo运行WikiEditSourceV2Example.scala时,我发现了完全相同的问题。不确定这是否是一个错误,或者我和上述回购协议的作者是否遗漏了什么

编辑2:添加amps流媒体源的代码 导入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")
  }
}
以及微博客阅读器的签名

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

想分享amps源代码吗?@JacekLaskowski我已经发布了amps源代码。我很难发布AmpsMicroBatchReader的实现,因为它有很多意大利式的专有代码,而且只有几百行。不过,我可以编写一个较小的示例,如果有帮助的话,可以放在github上。实际上,调用拖缆代码——我可以看到print语句运行了两次,在第二次执行中,它抛出了IllegalArgumentException,因为模式的可选值也不再填充。如果我能提供更多相关信息,请告诉我。“不过,我可以编写一个较小的示例,如果它有帮助的话,可以放在github上。”这非常有帮助,因为我无论如何都必须这样做。@JacekLaskowski我已经创建了一个。当schema optional为空时,我删除了异常,但是我记录了对createMicroBatchReader的调用以及schema参数的值。如果您使用StreamingExample类,您将看到createMicroBatchReader对于单个流被调用两次,第二次模式可选为空(我传入一个虚拟模式只是为了测试它)。希望我的例子足够清楚,但如果不清楚,请告诉我您是否有任何问题或我可以补充什么。有人知道这一点吗,我面临着同样的问题。任何线索将不胜感激