2016-11-08 40 views
1

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

回答

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 

这应该是一个预计处理时间为一个分区和价值,我们得到的是相当的到任务调度时间。

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

1

这个问题是相当广泛的,因此我的答案将会很宽泛,但你会得到的图片。

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

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

这就是为什么应该进行基准测试和监测。你也可以计算Spark上下文需要设置和拆卸的时间,这可能是你计算时间的一个重要部分。

再加上一个m4.large是一个相当强大的机器用于此目的。如果您在EMR群集上设置神经节,您会注意到,spark几乎不会使用其资源,这会导致您在启动EMR上的Spark应用程序时考虑进行调整。

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

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

+0

谢谢埃利亚斯。我明白数据的局部性,数据格式和任务的复杂性是需要考虑的重要问题,但我认为针对这些问题(例如:网络I/O在哪里),pi逼近的具体问题并不是非常困难。您如何知道Spark花费在设置和拆卸上的时间?神经节显示这种信息吗? – Patrick

+0

我已经提到了网络瓶颈问题,但它不应该是你的情况,我相信你需要知道它。你可以测量连接到ssh的设置和连接,编写一个简单的应用程序来实现这一点,你可能会有一个关于它需要多少的经验概念。那里没有魔法。 – eliasah