在mapWithState中按需快照

时间:2018-07-30 21:29:56

标签: apache-spark-sql spark-streaming

我正在从Kafka流式传输数据(批处理间隔为10秒),将RDD转换为PairRDD,然后使用mapWithState()将RDD存储为状态。下面是代码:

    JavaPairDStream<String, Object> transformedStream = stream
            .mapToPair(record -> new Tuple2<>(record.getKey(), record))
            .mapWithState(StateSpec.function(updateDataFuncGDM).numPartitions(32)).stateSnapshots();

transformedStream.foreachRDD(rdd -> {
        //if flag is true, put the RDD to a SQL table, and run a query to do some aggregations liek sum, avg etc
       // if flag is false, return;
        }

现在,我继续在该状态下更新数据,并在某个事件中,将标志更改为true,然后将这些数据放在表中,然后进行计算。

这里的问题是,由于我在每个批次中都获取“ stateSnapshots”,因此效率不高,并且mapWithState在内存中保留了大量数据,并且随着状态的增长,它会变得更糟。另外,由于mapWithState每10次迭代后会检查一次数据,因此,由于数据非常大,因此要花费大量时间。

我想仅按需获取状态的stateSnapshot(即仅在标志为true时在foreachRDD的迭代中) 但是我没有找到很多与国家打交道的方法

0 个答案:

没有答案