从卡夫卡流媒体火花如何指定轮询事件的截止时间

时间:2019-01-11 17:05:44

标签: scala apache-spark apache-kafka spark-streaming kafka-consumer-api

我有一个运行在一天结束时的火花流应用程序,它使用上游应用程序发送的kafka事件。当前上游应用程序整天不断推送新数据,而我的消费者最终开始使用它。我想限制基于截止时间(例如每天下午6点)消耗的事件。是否有一种方法可以指定截止值以基于截止时间(例如kafka事件时间戳记)或其他东西来限制消耗的事件。下面是使用者代码

  KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topicSet, kafkaParams))

3 个答案:

答案 0 :(得分:1)

您可以根据timeStamp或时间或任何字段在处理过程中过滤掉事件。例如,假设您的事件是JSON,并且有一个名为hour的字段,它是事件时间的小时值。您可以轻松地仅选择在6之前创建的事件,如下所示。

directStream.foreachRDD { rdd =>
        val eventDfRDD = rdd.filter(record => {
          val option = JSON.parseFull(record).get.asInstanceOf[Map[String, String]]
          option.get("hour") < 1800
        })
      }

答案 1 :(得分:1)

当您声明流上下文时,我们可以提及创建dsstream的截止时间,并且可以将该值传递给createDirectStream参数。请找到代码捕捉。在下面的代码中,以5秒为截止时间。因此每5秒钟将创建DStream RDD。

sc = spark.sparkContext
ssc = StreamingContext(sc,5)
kvs = KafkaUtils.createDirectStream(ssc, ['Topic-name'], {"metadata.broker.list": 'Server-name:port-number'},valueDecoder=serializer.decode_message)

答案 2 :(得分:0)

这是我实施的解决方案

1:当火花流作业开始时,将当前时间存储在变量中

val cuttoffTime = System.currentTimeMillis()

2:创建DirectStream

val directKafkaStream=   KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topicSet, kafkaParams))

3:应用过滤条件 在foreach循环中,应用以下过滤条件

directKafkaStream.foreachRDD {rdd => val filterRdd = rdd.filter(_。timestamp()