2014-07-04 162 views
9

我有一個150G的txt文件(大約700個文件,平均每個200 MB)的文件夾。Spark內存不足

我正在使用scala來處理文件並計算最後的一些彙總統計信息。我看到兩種可能的方法來做到這一點:

  • 通過所有的文件手動循環,做到每個文件計算和合併到底
  • 讀取整個文件夾複製到一個RDD結果,做所有的操作這種單一的RDD,讓火花做所有的並行

我傾向於第二種方法,因爲它似乎更清潔(無需並行特定代碼),但我想知道如果我的方案將符合規定的約束通過我的硬件和數據。我有一個帶有16個線程和64 GB RAM的工作站(所以在不同處理器內核之間的並行化將是嚴格局部的)。我稍後可能會用更多的機器擴展基礎架構,但現在我只想專注於調整這一個工作站場景的設置。

我正在使用的代碼: - 讀取TSV文件和有意義的數據提取到(字符串,字符串,字符串)三胞胎 - 事後一些濾波,映射和執行分組 - 最後,數據被減小,並且一些聚合計算

我已經能夠用一個文件(〜200 MB的數據)運行此代碼,但是我得到一個java.lang.OutOfMemoryError:GC開銷限制超出 和/或Java出當添加更多的數據時(應用程序中斷了6GB的數據,但我想用150GB的數據),堆異常。我想我將不得不調整一些參數,使這項工作。我將不勝感激關於如何解決這個問題的任何提示(如何調試內存需求)。我試着增加'spark.executor.memory'並使用較少數量的內核(每個內核需要一些堆空間的理性存在),但這並沒有解決我的問題。

我不需要解決方案非常快(如果需要,它可以輕鬆運行幾個小時甚至幾天)。我也沒有緩存任何數據,而是最終將它們保存到文件系統。如果您認爲採用手動並行化方法會更可行,那麼我也可以這樣做。

+0

如果您以獨立模式運行Spark,則無法工作。您需要在資源管理器上運行您的應用程序,例如在Hadoop集羣上運行的每個示例的「YARN」。 – eliasah

+0

在單臺機器上運行YARN有意義嗎?如果沒有分佈式集羣存在,那麼獨立模式(如果配置正確)與集羣管理器的工作方式不同? – Igor

+1

如果您不打算使用分佈式集羣,您將如何在64RAM上安裝150G? – eliasah

回答

2

我和我的團隊已經成功處理了超過1TB的超過5TB的機器和32GB的RAM。這很大程度上取決於你在做什麼樣的處理以及如何處理。

  1. 如果重新分區的RDD,它需要額外的計算是 具有開銷上面堆大小,嘗試在 TextInputFormat.SPLIT_MINSIZETextInputFormat.SPLIT_MAXSIZE 通過降低分大小文件加載更多 paralelism(如果你是使用TextInputFormat)來提升 平等主義的水平。

  2. 嘗試使用mapPartition而不是map,因此您可以在分區內處理 計算。如果計算使用臨時 變量或實例,你仍然面臨淘汰內存,可以嘗試降低 每個分區數據的數量(增加了分區 號)

  3. 使用增加驅動器存儲和執行內存限制 「spark.executor.memory」和創建語境火花

注意,火花是一種通用集羣計算系統所以它的效率不高之前 配置在火花「spark.driver.memory」(IMHO)使用火花在一臺機器

+0

您是否有使用有限內存讀取大文件的示例代碼?特別是你如何使用TextInputFormat.SPLIT_MAXSIZE和mapPartitions?我使用'''conf.set(「TextInputFormat.SPLIT_MAXSIZE」,「512M」)''',沒有運氣。 – Kane

0

基於代碼添加另一個透視圖(與配置相對):有時最好弄清楚您的Spark應用程序在哪個階段超出內存,並查看是否可以進行更改以解決問題。當我學習Spark時,我有一個Python Spark應用程序,它碰到了OOM錯誤。原因是因爲我正在將所有結果收回到主服務器中,而不是讓任務保存輸出。

E.g.

for item in processed_data.collect(): 
    print(item) 
  • 失敗,OOM錯誤。在另一方面,

processed_data.saveAsTextFile(output_dir)

  • 工作的罰款。