Spark Streaming和Azure Event Hubs mapWithState

时间:2017-02-15 13:50:16

标签: azure apache-spark spark-streaming azure-eventhub

我已经成功整合了代码,将消息从事件中心拉出,并通过spark / spark-streaming处理它们。当消息传递时,我现在正在转向管理状态。这是我正在使用的代码,其中大部分是https://docs.cloud.databricks.com/docs/spark/1.6/examples/Streaming%20mapWithState.html

的改编

基本上这适用于虚拟源,它适用于单个分区上的单个流,但它不适用于工会化的窗口流。虽然我可以为每个分区创建一个流的多个实例但它有点失败联盟和窗口的关键...... +我尝试让它以这种方式工作失败了。我现在有点想要去寻找灵感......如果有人有任何想法会很棒......

val sparkSession = SparkSession.builder().master("local[2]").config(sparkConfiguration).getOrCreate()

val streamingContext = new StreamingContext(sparkSession.sparkContext, Seconds(10))
streamingContext.checkpoint(inputOptions.checkpointDir)

//derive the stream and window
val eventHubsStream = EventHubsUtils.createUnionStream(streamingContext, eventHubsParameters)
val eventHubsWindowedStream = eventHubsStream.window(Seconds(10))

val initialRDD = sparkSession.sparkContext.parallelize(List(("dummy", 100L), ("source", 32L)))
val stateSpec = StateSpec.function(trackStateFunc _)
  .initialState(initialRDD)
  .numPartitions(2)
  .timeout(Seconds(60))

val eventStream = eventHubsWindowedStream
  .map(messageStr => {
    //parse teh event
    var event = gson.fromJson(new String(messageStr), classOf[Event])

    //return a tuble of key/value pair
    (event.product_id.toString, 1)
  })

val eventStateStream = eventStream.mapWithState(stateSpec)

val stateSnapshotStream = eventStateStream.stateSnapshots()
stateSnapshotStream.print()

stateSnapshotStream.foreachRDD { rdd =>
  import sparkSession.implicits._
  rdd.toDF("word", "count").registerTempTable("batch_word_count")
}

streamingContext.remember(Minutes(1))  

streamingContext

1 个答案:

答案 0 :(得分:0)

我解决了我的问题,因为我最终使用直接流,我的所有问题都消失了。我避免了这个,因为进度目录只支持HDFS或ADL,现在我再也无法在本地测试了。

EventHubsUtils.createDirectStreams(streamingContext,inputOptions.namespace,       inputOptions.hdfs,Map(inputOptions.eventhub - > GetEventHubParams(inputOptions)))

仍然,联合流不起作用..现在我只需要弄清楚如何删除HDFS中的进度目录!!