我有来自Kafka的流媒体工作(使用createDstream
)。
它的“id”流
[id1,id2,id3 ..]
我有一个实用程序或api接受一个id的数组并进行一些外部调用,并收到一些信息,说“t”为每个id
[id:t1,id2:t2,id3:t3...]
我希望在调用该实用程序时保留DStream
以保留Dstream。我无法在Dstream rdd上使用地图转换,因为它会调用每个id,而且该实用程序正在接受id的集合。
Dstream.map(x=> myutility(x)) -- ruled out
如果我使用
Dstream.foreachrdd(rdd=> myutility(rdd.collect.toarray))
我失去了DStream
。我需要保留DStream
以进行下游处理。
答案 0 :(得分:4)
实现外部批量调用的方法是在分区级别直接转换DStream中的RDD。
模式如下:
val transformedStream = dstream.transform{rdd =>
rdd.mapPartitions{iterator =>
val externalService = Service.instance() // point to reserve local resources or make server connections.
val data = iterator.toList // to act in bulk. Need to tune partitioning to avoid huge data loads at this level
val resultCollection = externalService(data)
resultCollection.iterator
}
}
此方法使用群集中可用的资源并行处理基础RDD的每个分区。请注意,需要为每个分区(而不是每个元素)实例化与外部系统的连接。