用例:我们收集了要分析的小文件。
Spark设置:Spark1.5具有独立群集,2个工作节点,每个节点8核,每个10GB内存。
计划:
1)文档被加载到List<Tuple2<Doc_Name, Doc_Contents>>
2)使用上面的集合调用parallelizePairs,并将分区大小设置为100
3)Map() - 分析每个文档,然后生成json
4)收集()
问题: 对于首先安排的任务(任务0到16),“执行器计算时间”大约为3分钟,但对于稍后安排的任务,“执行器计算时间”每次增加(8分钟,12分钟和17分钟)。{ {3}}
观察:
当我在本地模式下运行代码时,每个任务都采用相同的数量,一切正常。当在独立群集模式下执行相同的代码时,每个任务变得越来越慢,如屏幕截图所示。我确实尝试过客户端和集群部署模式,在这两种情况下,当独立集群中执行的应用程序“后执行计算时间”增加后续任务时。
示例代码:
List<Tuple2<String, String>> data = getData(); -> data is around 7MB
JavaPairRDD<String, String> pairRDD = sc.parallelizePairs(data, 100);
JavaRDD<Tuple2<String, String>> aRDD = resumePairRDD.map(new ProcessDoc());
List<Tuple2<String, String>> output = aRDD.collect();
public class ProcessDoc implements Function<Tuple2<String, String>, Tuple2<String, String>>, Serializable {
@Override
public Tuple2<String, String> call(Tuple2<String, String> fileNameContentTuple) throws Exception {
String fileName = FilenameUtils.getBaseName(fileNameContentTuple._1());
String content = fileNameContentTuple._2();
// Below API has dependency on many other classes and approximately takes around 2 seconds for each record.
DocumentAnalyzerResponse documentAnalyzerResponse = DocumentAnalyzerFactory.parse(content);
String resultJson = objectMapper.writeValueAsString(documentAnalyzerResponse);
// Upload the resultJson to s3
}
}
感谢所有评论。