假设我有一个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
以分隔各个阶段吗?
非常感谢你。
答案 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
。