如何在SparkStreaming中停止DirectStream后保存数据以便稍后处理?

时间:2018-06-09 05:31:45

标签: apache-spark apache-kafka spark-streaming

我在KafkaDirectStream下创建。

  val messages = KafkaUtils.createDirectStream[String, String](
         ssc,
         LocationStrategies.PreferConsistent,
         ConsumerStrategies.Subscribe[String, String](topicsSet, kafkaParams))

然后将值保存为:

  val lines = messages.map(_.value)

然后在我没有进一步消耗时停止流式上下文,如下所示:

  lines.foreachRDD(rdd => {
      if(rdd.isEmpty()) {
        messages.stop()
        ssc.stop(false)
      } else {

      }
  })

然后我按如下方式打印lines

    lines.print()

然后我开始流:

    ssc.start()

工作正常。它读取rdds并打印前10个并停止消息流并停止流上下文。但是当我执行相同的行lines.print()时,它会抛出一个异常,表示在停止streamingContext后无法执行新的输入,转换或输出。

我如何实现目标?我在spark-shell中运行它而不是二进制(强制要求)。

这是我真正想要实现的目标:

1)使用kafka主题中的所有json记录。

2)停止获取更多记录(保证在消费之后,Kafka主题不会添加新记录,因此不要继续保持记录。)

3)通过从JSON字段中提取一些字段来进行一些预处理。

4)对预处理数据进行进一步操作。

5)完成。

1 个答案:

答案 0 :(得分:0)

当你打电话" lines.print()"再次,它试图调用转换" messages.map(_。value)"再次。当你停止上下文失败时。

通过在停止上下文之前执行操作来保存线路变量。