2016-11-08 66 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