如何在Spark Streaming中的paralell中映射键/值分区

时间:2016-06-19 13:24:21

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

我有一个以本地模式运行的Spark Streaming程序,我从TCP套接字连接接收JSON消息,每个批处理间隔几个。

这些消息中的每一个都有一个ID,我用它来创建一个键/值JavaPairDStream,这样在我的JavaDStream中的RDD的每个分区中,都有一个键/值对,每个分区只有一条消息。 / p>

我现在的目标是将具有相同ID的消息组合在同一个分区中,这样我就可以并行映射它们,每个分区都由不同的核心处理。

以下是我的代码:

JavaReceiverInputDStream<String> streamData2 = ssc.socketTextStream(args[0], Integer.parseInt(args[1]),
            StorageLevels.MEMORY_AND_DISK_SER);
JavaDStream<String>streamData1=streamData2.repartition(1);

JavaPairDStream<String,String> streamGiveKey= streamData1.mapPartitionsToPair(new PairFlatMapFunction<Iterator<String>, String, String>() {
        @Override
        public Iterable<Tuple2<String, String>> call(Iterator<String> stringIterator) throws Exception {

            ArrayList<Tuple2<String,String>>a= new ArrayList<Tuple2<String, String>>();

            while (stringIterator.hasNext()){
                String c=stringIterator.next();
                if(c==null){
                    return null;

                }

                JsonMessage retMap = new Gson().fromJson(c,JsonMessage.class);
                String key= retMap.getSid();
                Tuple2<String,String> b= new Tuple2<String,String>(key,c);
                a.add(b);

            }

            return a;
        }
    });

所以,在这段代码的最后,我有一个带有RDD的DStream,由于repartition{1}只有一个分区,其中包含所有键/值对。

我现在应该如何对具有相同密钥的邮件进行分组,并将它们放入不同的分区,以便我可以单独映射它们?

1 个答案:

答案 0 :(得分:0)

这个问题是 - 根据OP - 通过同时回答另一个问题来解决:How to group key/values by partition in Spark?