我写了一个火花流媒体作业,从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分钟。与其他任务相比任务非常高的随机数据,这会导致瓶颈。
有没有办法可以更均匀地分配所有任务中的负载?
答案 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。