在 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平台中管理整个过程所花费的时间,小数据的实际处理时间可能非常小。因此,独立程序的性能肯定会比 mapreduce
、spark
等 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 应用程序很慢的主要内容,如果未能解决你的问题,请参考以下文章
在 EMR 集群中运行 Spark 应用程序时在哪里指定 Spark 配置
通过记录器的 Java Spark 应用程序日志未显示在 EMR 日志中
如何在 EMR 上使用 Spark 3 为 Scala 对象解决“加载类失败”