Spark 执行时间与 AWS EMR 上的节点数

Spark execution time vs number of nodes on AWS EMR

我是 Spark 的新手。我尝试 运行 Amazon EMR 上的一个简单应用程序(Python 找到 pi 近似值 here),其中有 1 个工作节点,第二阶段有 2 个工作节点 (m4.large)。每次完成任务所用时间约为 25 秒。天真地,我期待 2 个节点的 1.5 倍增益。我天真吗?正常吗?

这个问题很宽泛,因此我的回答也会很宽泛,但你会明白的。

更多的机器并不意味着总是更快的计算,特别是在 Pi 近似上。

您不应忘记最终的瓶颈:网络 I/O、数据偏斜、昂贵的转换、分区等。

这就是应该进行基准测试和监控的原因。此外,您可能正在计算 Spark 上下文需要设置和拆除的时间,这可能是您计算时间的很大一部分。

此外,m4.large 是用于此目的的非常强大的机器。如果您在 EMR 集群上设置 Ganglia,您会注意到 Spark 几乎没有使用它的资源,这会让您在 EMR 上启动 Spark 应用程序时考虑调优。

现在回答你的问题。 是的,对于您正在启动的应用程序,该行为是正常的。

这是我不久前写的一篇 post 关于 improving latency on a single node apache spark cluster 的文章,可能会为您提供有关此主题的更多信息。

让我们做一个简单的实验:

from functools import reduce
from operator import add
import timeit

# Taken from the linked example.

n = 100000

def f(_):
    x = random() * 2 - 1
    y = random() * 2 - 1
    return 1 if x ** 2 + y ** 2 < 1 else 0

%timeit -n 100 reduce(add, (f(x) for x  in range(n)))

我使用相当旧的硬件得到的结果:

100 loops, best of 3: 132 ms per loop

这应该是单个分区的预期处理时间,我们得到的值与任务调度时间相当。

结论?您测量的是集群和应用程序延迟(上下文初始化、调度延迟、上下文拆卸)而不是处理时间。