我有一些看起来像这样的代码:
JavaDStream<String> stream = KafkaUtils.createDirectStream(...)
stream.transform(rdd -> {
log("Action phase 1")
// transformation logic, really fast
return transform(rdd);
}).forEachRDD(javaRDD -> {
log("Action phase 2")
// mapping functions with a relatively long processing delay,
// this will lead to some number of queued batches
mapRdd(javaRDD);
})
当我跟踪日志时,我们注意到“操作阶段1”在日志中多次出现(时间与排队的批次数量成正比),而“操作阶段2”对于每个已处理的批次仅出现一次。似乎stream.transform()
的“惰性”转换相对于RDD转换急切地执行。
我目前的理论是,流内部的Rdd转换也相对于流也懒惰地执行。因此,它是惰性转换内部的惰性转换,因此与内部转换相比,“外部”转换很热衷。
这个理论正确吗?还是这里还有其他工作?
谢谢!