如何缩短Standalone群集上最后一个任务的执行时间?

时间:2014-12-09 15:57:21

标签: apache-spark

我有这段代码:

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。

1 个答案:

答案 0 :(得分:4)

您有8个执行器核心(从属核心)。 RDD可能有20个分区(来自wholeTextFiles调用)。当作业开始时,将创建20个任务,执行者将获取其中的8个任务。当一个任务完成时,会拾取一个新任务。最终剩下的任务将少于8个,执行程序线程将开始变为空闲状态。在作业完成之前,您会看到CPU使用逐渐减少。

请注意,您使用的是一台计算机(主计算机未执行工作)和分布式计算系统。这对开发很好,当你不关心性能时。但是,如果您想提高性能,请使用多台计算机或不使用Spark。