我在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)完成。
答案 0 :(得分:0)
当你打电话" lines.print()"再次,它试图调用转换" messages.map(_。value)"再次。当你停止上下文失败时。
通过在停止上下文之前执行操作来保存线路变量。