0

我面臨一個獨特的問題,並希望您的意見在這裏。Spark作爲Mapreduce的存儲層

我有一個傳統的map-reduce應用程序,其中多個map-reduce作業按順序運行,中間數據來回寫入HDFS。由於將中間數據寫入HDFS,具有小數據的作業將比HDFS的功能獲得的收益損失更多,而且花費的時間要遠遠多於非Hadoop等價物所花費的時間。最終,我計劃將我所有的地圖縮減工作轉換爲Spark DAG,但這是一個巨大的改變,所以我相當拖延。

作爲一個短期解決方案,我真正想要的是改變存儲層,以便繼續從map-reduce並行性中受益,但不要爲存儲層付出太多代價。在這個方向上,我正在考慮使用Spark作爲存儲層,其中map-reduce作業將通過Spark上下文將其輸出存儲在Spark中,並且輸入將被再次讀取(通過創建Spark輸入拆分,每個拆分將擁有它自己的Spark Spark)。

以這種方式,我將能夠以內存速度操作中間數據讀/寫,這在理論上會給我顯着的性能提升。

我的問題是,這個架構方案是否有意義?有沒有人遇到過這樣的情況?我錯過了一些重要的東西,即使在解決方案的初步階段,我也應該考慮這些東西?

在此先感謝!

+0

你能詳細說明一下你想要以一步一步的方式做什麼的例子。 [如何問](http://stackoverflow.com/help/how-to-ask) –

+0

嗨拉姆,我想採用一些內存存儲層的中間數據我的地圖減少工作產生的。目前,map-reduce輸出存儲在HDFS中,這會導致性能損失而不是複製/分佈式存儲性質(我不想在某些環境中出現這種情況,例如系統測試環境) – Abhishek

回答

1

這個架構方案有意義嗎?

它沒有。 Spark沒有獨立的存儲層,所以你可以在這裏使用任何東西。如果它的核心不夠用,它就會使用標準的Hadoop輸入格式來讀寫數據。

如果您想降低存儲層的開銷,您應該考慮加速加速存儲(如Alluxio)或內存網格(如Ignite Hadoop Accelerator)。

+0

好吧,我的意思是使用作爲存儲層的Spark是爲了保存和加載數據而使用Spark。如此有效,它在技術上意味着在映射器的映射方法中創建RDD,然後將創建的RDD緩存/保留在清理方法中。 在下一個作業中,從先前的作業中讀取緩存的RDD中的數據,依此類推。 這在技術上不可行嗎? 我已經通過Ignite Hadoop加速器進行了一些調整,但希望先消除其他可能的解決方案:) – Abhishek

+1

RDD緩存是用於存儲中間計算的部分結果的臨時機制。它不是一個存儲解決方案,它不是永久的,它甚至不提供數據將被緩存的保證。它沒有超越Spark的用法。 –

+0

謝謝,Alluxio和Ignite都對我的情況有完全的理解! – Abhishek