Apache spark 在EMR上运行Spark应用程序速度较慢

Apache spark 在EMR上运行Spark应用程序速度较慢,apache-spark,java-8,mapreduce,emr,amazon-emr,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秒。请参阅下面的代码 这是火花代码104.99秒:

我是Spark和MApReduce的新手,在Elastic Map Reduce EMR AWS群集上运行Spark时遇到问题。 问题是,运行EMR对我来说需要很多时间

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

然而,当我在没有Spark的情况下使用Java8并将.csv文件转换为List进行同样的计算时,只花了0.5秒。请参阅下面的代码

这是火花代码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的新手,所以我不知道该怎么解决这个问题

更新: 这是该函数的一个示例。我的全部任务是计算不同的统计数据总和、均值、中位数,并对6GB的数据执行不同的转换。这就是我决定使用Spark的原因。
整个应用程序有6gb的数据,使用常规Java运行大约需要3分钟,使用Spark和MapReduce运行大约需要18分钟,我相信你是在比较桔子和苹果。 您必须了解何时使用BigData和普通Java程序

大数据不是用于处理小数据量的,大数据框架需要在分布式环境中执行多个管理任务,这是一个巨大的开销。在小数据的情况下,实际处理时间可能与hadoop平台中管理整个过程所需的时间相比非常小。因此,一个独立的程序比mapreduce、spark等BigData工具表现得更好

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

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

下表大致解释了您应该何时转向大数据


我相信你是在拿桔子和苹果作比较。 您必须了解何时使用BigData和普通Java程序

大数据不是用于处理小数据量的,大数据框架需要在分布式环境中执行多个管理任务,这是一个巨大的开销。在小数据的情况下,实际处理时间可能与hadoop平台中管理整个过程所需的时间相比非常小。因此,一个独立的程序比mapreduce、spark等BigData工具表现得更好

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

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

下表大致解释了您应该何时转向大数据


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