输入流数据不在任务之间平均分配

时间:2016-03-29 23:06:54

标签: java apache-spark task spark-streaming

我写了一个火花流媒体作业,从s3读取数据。 这份工作有mapwithstate系列,接着是maptopair电话,如下所示:

JavaDStream<String> cdrLines = ssc.textFileStream(cdrInputFile);
JavaDStream<CDR> cdrRecords = cdrLines.map(x -> cdrStreamParser.parse(x));
JavaDStream<CDR> cdrRecordsFiltered = cdrRecords
        .filter(t -> t != null);
JavaPairDStream<String, CDR> sTripletStream = cdrRecordsFiltered
        .mapToPair(s -> new Tuple2<String, CDR>(s
                .gettNumber(), s));

JavaPairDStream<String, Tuple2<CDR, List<StatusCode>>> stateDstream1 = sTripletStream
        .mapWithState(
                StateSpec.function(hsMappingFunc).initialState(
                        tripletRDD)).mapToPair(s -> s);

JavaPairDStream<String,Tuple2<CDR,List<StatusCode>>> stateDstream2 = stateDstream1
.mapWithState(StateSpec.function(cfMappingFunc).initialState(cfHistoryRDD))
        .mapToPair(s -> s);

JavaPairDStream<String, Tuple2<CDR, List<StatusCode>>> stateDstream3 = stateDstream2
        .mapWithState(StateSpec.function(imeiMappingFunc).initialState(imeiRDD))
        .mapToPair(s -> s);

我将spark.default.parallelism设置为6.我看到第一个和最后一个maptopair阶段足够快。第二和第三个maptopair阶段非常缓慢。

这些阶段中的每一个都经历了6个任务。在第二和第三个maptopair阶段,5个任务以2s运行。但是一项任务需要很长时间〜3-4分钟。与其他任务相比任务非常高的随机数据,这会导致瓶颈。

有没有办法可以更均匀地分配所有任务中的负载?

1 个答案:

答案 0 :(得分:0)

这是CDR处理的用例。每个CDR事件都有telno,imei,imsi,callforward,timestamp这些字段。

我在火花状态下维护3种信息:1。最后知道给定电话号码的CDR事件(记录)2。每个电话的呼叫号码列表3.所有已知的imei列表。 三个mapwithstate函数调用对应于以下功能: 步骤1:当CDR事件进入时,我需要与具有相同电话号码的最后已知CDR事件进行一些字段比较。我维持火花状态下给定telno的最新事件,以便我可以在新的CDR事件进入时进行现场比较。 step2:对于给定的telno。,我想检查callforward号码是否是已知号码。所以我需要保持telno的历史。 - &GT;州内的前向号码列表。 step3:我需要保持所有imei号码的列表,到目前为止在状态中,所以对于CDR事件中的每个imei,我们可以说它是已知的还是新的imei。