在 EMR 上运行 Spark 应用程序很慢

Posted

技术标签:

【中文标题】在 EMR 上运行 Spark 应用程序很慢【英文标题】:Running Spark app on EMR is slow 【发布时间】:2018-03-12 16:07:58 【问题描述】:

我是 Spark 和 MApReduce 的新手,在 Elastic Map Reduce (EMR) AWS 集群上运行 Spark 时遇到问题。 问题是在 EMR 上运行占用了我很多时间。

例如,我在 .csv 文件中有几百万条记录,我在 JavaRDD 中读取并转换了这些记录。对于 Spark,在此数据集上计算简单的 mapToDouble() 和 sum() 函数需要 104.99 秒。

虽然,当我在没有 Spark 的情况下使用 Java8 并将 .csv 文件转换为 List 进行相同的计算时,只用了 0.5 秒。 (见下方代码)

这是 Spark 代码(104.99 秒):

    private double getTotalUnits (JavaRDD<DataObject> dataCollection)

    if (dataCollection.count() > 0) 
    
        return dataCollection
                .mapToDouble(data -> data.getQuantity())
                .sum();
    
    else
    
        return 0.0;
    

这是相同的 Java 代码,但不使用 spark(0.5 秒)

    private double getTotalOps(List<DataObject> dataCollection)

    if (dataCollection.size() > 0)
    
        return dataCollection
                .stream()
                .mapToDouble(data -> data.getPrice() * data.getQuantity())
                .sum();
    
    else
    
        return 0.0;
    


我是 EMR 和 Spark 的新手,所以我不知道,我应该如何解决这个问题?

更新: 这是该函数的一个示例。我的整个任务是计算不同的统计数据(总和、平均值、中位数)并对 6 GB 的数据执行不同的转换。这就是我决定使用 Spark 的原因。 整个应用程序包含 6gb 数据,使用常规 Java 运行大约需要 3 分钟,使用 Spark 和 MapReduce 运行大约需要 18 分钟

【问题讨论】:

【参考方案1】:

我相信您是在将橙子与苹果进行比较。 您必须了解何时使用 BigData 与普通 Java 程序?

大数据不是为了处理小规模的数据,Bigdata框架需要在分布式环境中执行多项管理任务,开销很大。相对于在hadoop平台中管理整个过程所花费的时间,小数据的实际处理时间可能非常小。因此,独立程序的性能肯定会比 mapreducespark 等 BigData 工具更好。

如果您希望看到差异,请确保通过上述两个程序处理至少 1 TB 的数据,并比较处理相同的时间。

除了以上几点,BigData 还带来了处理中的容错性。想一想——如果 JVM 崩溃(比如 OutOfMEmoryError)正常的 Java 程序执行会发生什么?在普通的java程序中,整个过程都崩溃了。在 Bigdata 平台中,该框架确保处理不停止,并且发生故障恢复/重试过程。这使它具有容错性,并且您不会因为崩溃而失去对其他数据部分所做的工作。

下表粗略说明,何时应该切换到大数据。

【讨论】:

感谢您的回复。知道这一点很有用。在我的问题中,我只测量了我的应用程序的一个部分。我的全部任务是计算不同的统计数据(总和、平均值、中位数)并对 6 GB 的数据执行不同的转换。这就是我决定使用 Spark 的原因。整个应用程序包含 6GB 数据,使用常规 Java 运行大约需要 3 分钟,使用 Spark 和 MapReduce 运行大约需要 18 分钟。 @HelloWorld 知道了!如您所见,数据甚至不在medium 类别中。您的数据是在一个文件中还是在多个小文件中? 谢谢!!是的,我有 10 个文件,每个文件约 600MB。 @HelloWorld 然后将所有文件合并为一个,然后尝试mapreduce/spark。你应该会看到轻微的改善。在您的情况下,我建议使用普通的 Java 程序。多线程 Java 程序会快得多,其中每个线程都在处理单个文件,然后汇总结果以产生最终输出。但是,如果音量可能会增加,您可以继续使用Bigdata。此外,Bigdata 具有防止数据丢失和处理故障恢复的可靠性。

以上是关于在 EMR 上运行 Spark 应用程序很慢的主要内容,如果未能解决你的问题,请参考以下文章

简单的 Spark 应用程序在 3 GB 数据上运行缓慢

在 EMR 集群中运行 Spark 应用程序时在哪里指定 Spark 配置

通过记录器的 Java Spark 应用程序日志未显示在 EMR 日志中

如何在 EMR 上使用 Spark 3 为 Scala 对象解决“加载类失败”

AWS EMR - IntelliJ 远程调试 Spark 应用程序

为啥 AWS EMR 上的 Spark 不从应用程序 fat jar 加载类?