Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 输入流数据在任务之间分布不均匀_Java_Apache Spark_Task_Spark Streaming - Fatal编程技术网

Java 输入流数据在任务之间分布不均匀

Java 输入流数据在任务之间分布不均匀,java,apache-spark,task,spark-streaming,Java,Apache Spark,Task,Spark Streaming,我已经写了spark streaming作业,它从s3读取数据。 作业具有一系列mapwithstate,后跟maptopair调用,如下所示: JavaDStream<String> cdrLines = ssc.textFileStream(cdrInputFile); JavaDStream<CDR> cdrRecords = cdrLines.map(x -> cdrStreamParser.parse(x)); JavaDStream<CDR>

我已经写了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);
JavaDStream cdrLines=ssc.textFileStream(cdriputfile);
JavaDStream cdrRecords=cdrLines.map(x->cdrStreamParser.parse(x));
JavaDStream cdrRecordsFiltered=cdrRecords
.filter(t->t!=null);
JavaPairDStream sTripletStream=CDRecordsFiltered
.mapToPair->new Tuple2
.gettNumber(),s));
JavaPairDStream stateDstream1=sTripletStream
.mapWithState(
StateSpec.function(hsMappingFunc).initialState(
TripleTradd)).mapToPair(s->s);
JavaPairDStream stateDstream2=stateDstream1
.mapWithState(StateSpec.function(cfMappingFunc).initialState(cfHistoryRDD))
.mapToPair(s->s);
JavaPairDStream stateDstream3=stateDstream2
.mapWithState(StateSpec.function(imeiMappingFunc).initialState(imeird))
.mapToPair(s->s);
我已将spark.default.parallelism设置为6。我看到第一个和最后一个maptopair阶段足够快。第二级和第三级maptopair速度非常慢

这些阶段中的每一个都贯穿6个任务。在第二和第三个maptopair阶段中,5个任务与2个任务一起运行。但有一项任务需要很长的时间~3-4分钟。与其他任务相比,该任务的洗牌数据量非常高,这导致了瓶颈


有没有一种方法可以更均匀地在所有任务之间分配负载

这是CDR处理的用例。每个CDR事件都有以下字段:telno、imei、imsi、callforward、timestamp

我在spark状态下维护3种信息:1。给定电话号码2的上次已知CDR事件(记录)。每个电话的呼叫前转号码列表3。所有已知imei的列表。 三个mapwithstate函数调用对应于以下功能: 步骤1:随着CDR事件的到来,我需要与上一个已知的具有相同电话号码的CDR事件进行一些字段比较。我在spark状态下维护给定telno的最新事件,以便在出现新CDR事件时进行字段比较。 步骤2:对于一个给定的电话号码,我想检查一下呼叫前向号码是否为已知号码。所以我需要保存telno的历史记录。->状态中的呼叫转发号码列表。
步骤3:我需要维护该州迄今为止遇到的所有imei号码的列表,以便对于CDR事件中的每个imei,我们可以说它是已知的还是新的imei

你能解释一下你的代码想要实现什么吗?也许通过更好的上下文,我们可以帮助制定更好的图表。