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

时间:2018-03-12 16:07:58

标签: apache-spark java-8 mapreduce emr amazon-emr

我是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 个答案:

答案 0 :(得分:4)

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

大数据不适用于要处理的小型数据,Bigdata框架需要在分布式环境中执行多个管理任务,这是一个很大的开销。对于在hadoop平台中管理整个过程所花费的时间,在小数据的情况下实际处理时间可能非常小。因此,独立程序的性能优于mapreducespark等BigData工具。

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

除此之外,BigData在处理方面带来了容错能力。想一想 - 如果JVM崩溃(比如OutOfMEmoryError)正常的Java程序执行会发生什么?在普通的java程序中,只需整个进程崩溃。在Bigdata平台中,该框架确保不停止处理,并且发生故障恢复/重试过程。这使得它具有容错能力,并且您不会因为崩溃而放弃在其他数据部分上完成的工作。

下表粗略解释,何时应切换到大数据。

enter image description here