运行 EMR 上的 Spark 应用运行缓慢

Running Spark app on EMR is slow

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

例如,我在 .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 分钟 运行

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

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

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

除此之外,BigData在处理过程中引入了容错。想一想 - 如果 JVM 崩溃(比如 OutOfMEmoryError)正常 Java 程序执行会发生什么?在正常的 java 程序中,整个过程都崩溃了。在 Bigdata 平台中,框架确保处理不会停止,并且会发生失败 recovery/retry 过程。这使得它具有容错能力,并且您不会因为崩溃而丢失对数据其他部分所做的工作。

下面table粗略解释一下,什么时候应该转向大数据。