Apache spark 集群中的Spark作业非常慢(“执行者计算时间”随着每个任务的增加而增加)

Apache spark 集群中的Spark作业非常慢(“执行者计算时间”随着每个任务的增加而增加),apache-spark,Apache Spark,用例:我们收集了一些需要分析的小文档 Spark设置:Spark1.5,带独立群集,2个工作节点,每个节点8核,每个节点10GB内存 节目: 1) 文档被加载到列表中 2) 使用上述集合调用parallelizePairs,并将分区大小设置为100。 3) Map()-分析每个文档,然后生成json。 4) 收集 问题: 对于首先调度的任务(任务0到16),“执行器计算时间”约为3分钟,但对于稍后调度的任务,“执行器计算时间”每增加一次(8分钟、12分钟和17分钟) 观察: 当我在本地模式下运行

用例:我们收集了一些需要分析的小文档

Spark设置:Spark1.5,带独立群集,2个工作节点,每个节点8核,每个节点10GB内存

节目:
1) 文档被加载到
列表中

2) 使用上述集合调用parallelizePairs,并将分区大小设置为100。
3) Map()-分析每个文档,然后生成json。
4) 收集

问题: 对于首先调度的任务(任务0到16),“执行器计算时间”约为3分钟,但对于稍后调度的任务,“执行器计算时间”每增加一次(8分钟、12分钟和17分钟)

观察:
当我在本地模式下运行代码时,每个任务都会占用相同的数量,并且一切正常。当在独立集群模式下执行相同的代码时,每个任务都会变得越来越慢,如屏幕截图所示。我确实尝试过客户端和集群部署模式,在这两种情况下,当应用程序在独立集群中执行时,后续任务的“执行器计算时间”会增加

示例代码:

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
    }
}
List data=getData();->数据量约为7MB
javapairdd pairdd=sc.parallelizePairs(数据,100);
JavaRDD aRDD=resumePairRDD.map(newprocessdoc());
列表输出=aRDD.collect();
公共类ProcessDoc实现函数,可序列化{
@凌驾
公共Tuple2调用(Tuple2 fileNameContentTuple)引发异常{
字符串fileName=FilenameUtils.getBaseName(fileNameContentTuple._1());
String content=fileNameContentTuple._2();
//下面的API依赖于许多其他类,每条记录大约需要2秒钟。
DocumentAnalyzerResponse DocumentAnalyzerResponse=DocumentAnalyzerFactory.parse(内容);
String resultJson=objectMapper.writeValueAsString(documentAnalyzerResponse);
//将结果JSON上载到s3
}
}

感谢您的评论。

一旦调用collect(),您将如何处理这些数据?请发布spark-defaults.conf。还要检查您是否正在使用垃圾收集器,如果没有,则作业最终将死亡。同样在collect()之后,如果您不需要该数据,RDD应该是非持久的。您可以发布实际的代码吗?如果我们确切地知道您所写的内容,我们就更容易提供帮助(这样我们也可以自己测试)。加载的文档在大小上是否具有可比性?