我正在从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的迭代中) 但是我没有找到很多与国家打交道的方法