Как узнать, завершили ли работу RDD в окне потоковой передачи искры? - PullRequest
0 голосов
/ 12 октября 2018

Я читаю сообщения от Кафки в приложении Spark Streaming.

Продолжительность SparkBatch: 15 сек.SparkWindow: 60 сек.

var dstream = KafkaUtils.createDirectStream() // ignore the argumtns
var windowedStream = dstream.window(SparkWindow)
// delete data from REDIS
windowedStream.foreachRDD(rdd -> {
        if(!rdd.isEmpty()) {
                JavaFutureAction<Void> v = rdd.foreachPartitionAsync(t -> {
                // collect error data across partitions and write those to REDIS
        })// foreachPartitionAsync ends
    }
})
// fetchFromREDISAndProcess() --Once foreachRDD ends. fetch error data from REDIS and process them

Есть ограничения, что мне нужно сначала собрать записи об ошибках из каждого раздела и RDD в окне искры, а затем обработать их на драйвере.

Я получу4 RDD в каждом окне Spark.

Проблема: Я хочу читать данные из REDIS после каждого окна и обрабатывать их, прежде чем переходить к следующему окну.Есть ли способ гарантировать, что я выполняю свой код каждый раз, когда заканчивается окно свечи?

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете использовать ниже логику для этого :::

var dstream = KafkaUtils.createDirectStream() // ignore the argumtns
var windowedStream = dstream.window(SparkWindow)
// delete data from REDIS
var partitions = 4;
var currentPart = 0;

windowedStream.foreachRDD(rdd -> {
        if(!rdd.isEmpty()) {
                JavaFutureAction<Void> v = rdd.foreachPartitionAsync(t -> {
                // collect error data across partitions and write those to REDIS
        })// foreachPartitionAsync ends

        if(++currentPart % partitions == 0)    //It will be true at every 4th RDD where window will end.
            //Read data from REDIS and process here as after this new window will start.
    }
})
// fetchFromREDISAndProcess() --Once foreachRDD ends. fetch error data from REDIS and process them
...