我是Spark的新手。我试图在Amazon EMR(Python pi近似发现HERE)上运行一个简单的应用程序,其中包含1个工作节点,在第二个阶段运行2个工作节点(m4.large)。完成任务的经过时间大约是每次25秒。天真地,我期待着2个节点的1.5倍增益。我天真吗?这是正常的吗?
答案 0 :(得分:1)
这个问题相当广泛,因此我的回答也很广泛,但你会得到相应的结论。
更多的机器并不意味着总是更快的计算,特别是在Pi近似上。
您不应该忘记最终的瓶颈:网络I / O,数据偏差,昂贵的转换,分区等。
这就是为什么应该进行基准测试和监控的原因。此外,您可能正在计算Spark上下文需要设置和拆除的时间,这可能是您计算时间的一个重要部分。
另外,m4.large是一个非常强大的机器,可用于此目的。如果您在EMR集群上设置神经节,您会注意到火花几乎没有使用它的资源,这导致您在EMR上启动Spark应用程序时考虑调整。
现在回答你的问题。 是的,对于您正在启动的应用程序,这种行为是正常的。
这是我刚才写的关于 improving latency on a single node apache spark cluster的帖子,可能会为您提供有关此主题的更多信息。
答案 1 :(得分:1)
让我们做一个简单的实验:
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
这应该是单个分区的预期处理时间,我们得到的值与任务调度时间相当。
结论?您测量的是集群和应用程序延迟(上下文初始化,调度延迟,上下文拆除)而不是处理时间。