我有一个DStream [String,Object]我需要每隔一分钟计算一次avg,min和max值。 Dstream是从kafka创建的,msg每隔一分钟发布一次。到目前为止,我有以下代码。
val reducedRecords =newRecords.reduceByKeyAndWindow(aggMetrics(_,_),Seconds(60))
reducedRecords.map{data => data._2}.foreachRDD { rdd =>
if (!rdd.isEmpty) {
rdd.foreachPartition {
iter => {
storeData(iter, confMap, ruleEng)
}
}
}
}
}
def aggMetrics(a:Object,b:Object) = {
a.copy(
ts = math.min(a.ts,b.ts),
minValue = math.min(a.minValue,b.minValue),
maxValue = math.max(a.maxValue,b.maxValue),
sum = a.value+b.value,
count = a.count+b.count)
}
def storeData(iterator: Iterator[Object], confMap: Map[BackendAppSettings, String], ruleEng: StreamingEngine) = {
// logic to store the data to db
// while storing calculate avg using the sum/count
我的问题是......
1.这个代码在性能方面看起来不错,也有机会 数据分区时数据丢失的原因?
感谢。