在Kafka上遇到某些消息时停止火花蒸汽上下文

时间:2016-09-30 13:35:48

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

在我的Spark Streaming应用程序中,我正在读取某些Kafka主题的数据。每当我遇到某些消息(例如:“毒药”)时从主题中读取,我想停止流式传输。目前我使用以下代码实现此目的: jsc是JavaStreamingContext的实例,directStream是JavaPairInputDStream的实例。

LongAccumulator poisonNotifier = sc.longAccumulator("poisonNotifier");

directStream.foreachRDD(rdd -> {
            RDD<Row> rows = rdd.values().map(value -> {              
                if (value.equals("poison") {
                    poisonNotifier.add(1);
                } else {
                    ... 
                }
                return row;
            }).rdd();
        });

jsc.start();
ExecutorService poisonMonitor = Executors.newSingleThreadExecutor();
poisonMonitor.execute(() -> {
    while (true) {
        if (poisonNotifier.value() > 0) {
            jsc.stop(false, true);
            break;
        }
    }
});
try {
    jsc.awaitTermination();
} catch (InterruptedException e) {
    e.printStackTrace();
}
poisonMonitor.shutdown();

虽然这种方法有效,但这对我来说听起来并不合适。还有其他更好(更清洁)的方法来实现同样的目标吗?

0 个答案:

没有答案