如何处理我的RDD中的所有分区后,如何在Spark Streaming中接收输入?

时间:2016-06-11 18:18:31

标签: java apache-spark parallel-processing spark-streaming

假设我有一个JavaDStreamReceiver,它从Spark Streaming中的TCP / IP套接字连接每秒接收一个Integer。 然后我将它存储在一个列表中,直到我有100个整数。 之后,我想将该RDD划分为4个分区,我的电脑中每个核心分区一个,并在paralel中映射这些分区。所以像这样:

 public final class sparkstreaminggetjson {
 private static final Pattern SPACE = Pattern.compile(" ");
 private static Integer N=100;
 private static List<Integer> allInputValues= new List<Integer>();

 public static void main(String[] args) throws Exception {

  SparkConf sparkConf = new SparkConf().setMaster("local[2]").setAppName("sparkstreaminggetjson");


  JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(1));

  JavaReceiverInputDStream<Integer> receivedStream = ssc.socketTextStream(
        args[0],Integer.parseInt(args[1]), StorageLevels.MEMORY_AND_DISK_SER);

  JavaDStream<List<Integer>> storeValuesInList=receivedStream.map( // if N<100, keeps inserting integers; if N>100, inserts the new value into the List and removes the oldest value );

  JavaDStream<List<Integer>> partitionedList=storeValuesInList.repartition(4);


  JavaDStream<List<Integer>> someCalculations=partionedList.map(//some calculations)

  JavaDStream<List<Integer>> otherCalculations=someCalculations.map(//other calculations)

...

finalStream.print();

这是我的问题。我想实现一个FILO模型,在其中我收到一个新的输入,将它放在我的RDD的第一个分区中,并从RDD的最后一个分区中删除最后一个元素。所以我基本上从我的列表中放置并轮询整数,保持原始大小。之后我像往常一样并行处理每个分区。

这是我的问题:每当我的分区完成处理时,应用程序都会返回receivedStream,而不是partitionedList。也就是说,我得到每个分区的新输入,这不是我想要的。我想要处理每个分区,然后返回receivedStream以获得新的输入。

我该怎么做?我应该用map()之后的其他方法替换receivedStream以分隔各个阶段吗?

非常感谢你。

1 个答案:

答案 0 :(得分:1)

据我所知,您可以使用一个窗口:每秒1个整数表示您可以使用

JavaDstream integers = your stream;
JavaDstream hundredInt = integers.window(Seconds(100));

这样每个RDD就会有100个整数。

根据缓冲:newInt ->[1...25][26...50][51...75][76...100] ->lastInt
这就是我所理解的,所以如果你想保留最后的计算,你可以rdd.cache()你的新100个int并从中详细说明。要么是rdd.checkpoint