2017-04-12 66 views
0

我目前正在使用線性迴歸(Spark ML)中的基準評估小型集羣上的Spark 2.1.0(3個節點有32個CPU和128 GB Ram)。我只測量了參數計算的時間(不包括開始,數據加載,...)並確認了以下行爲。對於小型數據集0.1 Mio - 3 Mio數據點,測量時間並不真正增加,並停留在大約40秒。只有像300 Mio數據點那樣的較大數據集,處理時間纔會增加到200秒。所以看起來,集羣根本沒有擴展到小數據集。Spark集羣不能縮放到小數據

我還將本地pc上的小數據集與僅使用10個工作站和16GB RAM的集羣進行了比較。集羣的處理時間增加了3倍。那麼這被認爲是SPARK的正常行爲,並且可以通過通信開銷來解釋,或者我做錯了什麼(或者線性迴歸不是真正具有代表性)?

集羣是一個獨立的集羣(沒有Yarn或Mesos)以及90個工作人員提交的基準測試,每個工作人員都有1個內核和4 GB內存。

Spark提交內容: ./spark-submit --master spark:// server:7077 --class Benchmark - 部署模式客戶端--total-executor-cores 90 --executor -memory 4g - num-executors 90 .../Benchmark.jar pathToData

+0

我不確定你是否對小0.1-0的表現不滿意。3M數據集,還是更大的300M數據集? – ImDarrenG

+0

嗨,我不是不滿意的表現。我只是想知道,即使數據已經加載並且相當小,羣集花費半分鐘計算是正常的。 –

+0

我會說你的觀察是合理的。一旦我睡了一覺,我會提供一個更詳細的答案 - 如果在此期間沒有其他人做了。 – ImDarrenG

回答

0

最佳羣集大小和配置根據數據和作業的性質而有所不同。在這種情況下,我認爲你的直覺是正確的,因爲考慮到集羣的大小(核心和執行者),額外的開銷會導致在較小的數據集上完成工作的時間過長。

請注意,將數據量增加兩個數量級會使處理時間增加5倍。您正在將數據增加到集羣設置的最佳大小。

Spark是處理大量數據的好工具,但如果數據適合,它將不會在單臺機器上運行單個進程時具有競爭力。但是,它可能比其他基於磁盤的分佈式處理工具快得多,其中數據不適用於單臺計算機。

我在幾年前的一次談話中發言時給出了一個比喻,Spark就像是一輛自行車賽車: - 如果負載輕,加速和靈活性更快,重型火車頭可能需要一段時間才能趕上,但最終會更快。 (恐怕我忘了發言人的名字,但是在倫敦的卡桑德拉聚會上,發言人來自能源部門的一個公司)。

0

我同意@ ImDarrenG的評估,一般也是機車/自行車比喻。

有了這樣的數據量小,我會強烈建議

A)緩存整個數據集和

B)廣播數據集中到每一個節點(特別是如果你需要做一些喜歡你的300M行表加入到小數據集中)

要考慮的另一件事是文件數量(如果您還沒有被緩存),因爲如果您正在閱讀單個不可分離的文件,則只有一個核心能夠讀取該文件。但是,一旦緩存數據集(合適或合併重新分區),性能將不會升高onger被磁盤綁定/序列化行。

+0

我不確定廣播是什麼意思,但是緩存數據集提高了性能。 3M數據集現在在0.5秒內處理完畢。我也玩過重新分區,並獲得了50ms的改進。所以謝謝你的建議。 –

+0

@AndreasBartschat廣播意味着整個數據集被「廣播」給集羣中的所有執行者。這將整個數據集放在每個執行器的內存中,而不是僅僅選擇每個執行器上的分區。函數:'''ds.join(spark.sql.functions.broadcast(dataset),「join_column」)'''=>相關SOs:http://stackoverflow.com/questions/37487318/spark-sql-broadcast-散列連接| http://stackoverflow.com/questions/40320441/difference-between-sc-broadcast-and-broadcast-function-in-spark-sql | http://stackoverflow.com/questions/32435263/dataframe-join-optimization-broadcast-hash-join – Garren