2015-04-27 16 views
2

在Spark流中,在DStreams上实现自定义partiotioner的推荐方式是什么?JavaDStreamPairRDD的自定义partiotioning

我已经在批处理模式下使用了JavaPairRDD.partitionBy(分区程序),但在JavaDStreamPairRDD中没有找到相应的对象。

谢谢

+0

分区器的用例是什么? – maasg

回答

1

DStreams上的分区是通过从接收器获取数据的过程创建的。由每个接收器创建的数据流在小批量的spark.streaming.blockInterval(默认200毫秒)内被切割,每个微批成为RDD上为流式传输间隔产生的分区。 因此,流式分区是微量批处理的结果,并且定制分区程序在此级别上没有意义。

如果你需要在某个自定义形状的这些分区,你可以重新划分DSTREAM的每个RDD:

dstream.foreachRDD{rdd => 
val repRDD = rdd.partitionBy(...) 
... do stuff ... 
} 

要知道,你付出的洗牌价格重新分区,所以请谨慎使用。

+0

我的情况是我有多个DStream(用于并行),然后我合并成一个DStream。 如果这个DStream提供给我[a,b,c,d],我想分割出来,使得[a,b]是一个分区,[c,d]是另一个分区。 –

+0

@RanjitIyer我不明白这个问题。你想在不同的分区中使用[a,b]和[c,d]。你目前有什么?正如我所提到的,分区是由消息如何被接收器消耗来定义的。所以分区需要发生在上游(在Spark之外,使用流允许的任何原语) – maasg

+0

因此,如果两个接收器在DStream中生成两个RDD [a,b ,w,x]和[c,d,y,z],我希望它们被重新分区为[a,b,c,d]和[w,x,y,z]。我认为你上面给出的代码示例是实现它的方法。 –