我有这段代码:
JavaRDD<Document> termDocsRdd = sc.wholeTextFiles("D:/tmp11", 20).flatMap(
new FlatMapFunction<Tuple2<String,String>, Document>() {
@Override
public Iterable<Document> call(Tuple2<String,String> tup) {
return Arrays.asList(DocParse.parse(parsingFunction(tup));
}
}
);
这里我从本地存储(非分布式文件系统)中获取文本文件并对它们进行规范化(每个文件~100 KB - 1.5 MB)。 parsingFunction 没有任何Spark函数,如 map 或 flatMap 等。它不包含任何数据分发函数。
当我首先在独立群集上启动应用程序时,我看到工作机器的所有CPU的工作负载已满(100%),我在控制台中看到:
14/12/09 18:30:41 INFO scheduler.TaskSetManager: Starting task 8.0 in stage 0.0 (TID 8, fujitsu11., PROCESS_LOCAL, 1377 bytes)
14/12/09 18:30:41 INFO scheduler.TaskSetManager: Finished task 1.0 in stage 0.0 (TID 1) in 12873 ms on fujitsu11. (1/12)
14/12/09 18:30:42 INFO scheduler.TaskSetManager: Starting task 9.0 in stage 0.0 (TID 9, fujitsu11., PROCESS_LOCAL, 1327 bytes)
14/12/09 18:30:42 INFO scheduler.TaskSetManager: Finished task 0.0 in stage 0.0 (TID 0) in 14001 ms on fujitsu11. (2/12)
14/12/09 18:30:44 INFO scheduler.TaskSetManager: Starting task 10.0 in stage 0.0 (TID 10, fujitsu11., PROCESS_LOCAL, 1327 bytes)
14/12/09 18:30:44 INFO scheduler.TaskSetManager: Finished task 2.0 in stage 0.0 (TID 2) in 15925 ms on fujitsu11. (3/12)
...
后来我发现上一个任务的执行速度要慢得多 - CPU工作量大约为15%:
14/12/09 18:31:18 INFO scheduler.TaskSetManager: Finished task 10.0 in stage 0.0 (TID 10) in 33373 ms on fujitsu11. (11/12)
14/12/09 18:32:38 INFO scheduler.TaskSetManager: Finished task 11.0 in stage 0.0 (TID 11) in 104181 ms on fujitsu11. (12/12)
如何提高此代码的性能?
我的群集是一台主机,另一台是从机。所有机器都有8核CPU和16 GB RAM。
答案 0 :(得分:4)
您有8个执行器核心(从属核心)。 RDD可能有20个分区(来自wholeTextFiles
调用)。当作业开始时,将创建20个任务,执行者将获取其中的8个任务。当一个任务完成时,会拾取一个新任务。最终剩下的任务将少于8个,执行程序线程将开始变为空闲状态。在作业完成之前,您会看到CPU使用逐渐减少。
请注意,您使用的是一台计算机(主计算机未执行工作)和分布式计算系统。这对开发很好,当你不关心性能时。但是,如果您想提高性能,请使用多台计算机或不使用Spark。