在Spark流媒体作业中调用实用程序(外部)

时间:2017-01-06 14:10:00

标签: scala apache-spark spark-streaming rdd dstream

我有来自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以进行下游处理。

1 个答案:

答案 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的每个分区。请注意,需要为每个分区(而不是每个元素)实例化与外部系统的连接。