2016-12-06 73 views
1

我使用HDP 2.5,運行spark-submit作爲紗線集羣模式。紗線上的火花,帶有非零退出碼的集裝箱退出143

我試圖使用數據幀交叉連接生成數據。 即

val generatedData = df1.join(df2).join(df3).join(df4) 
generatedData.saveAsTable(...).... 

DF1存儲水平MEMORY_AND_DISK

DF2,DF3,DF4存儲水平MEMORY_ONLY

DF1有更多的記錄,即500萬,而DF2到DF4至多100條記錄。 這樣做我解釋明白會導致更好的性能使用BroadcastNestedLoopJoin解釋計劃。

由於某種原因,它總是失敗。我不知道如何調試它以及內存在哪裏爆炸。

錯誤日誌輸出:

16/12/06 19:44:08 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 
Container exited with a non-zero exit code 143 
Killed by external signal 

16/12/06 19:44:08 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 
Container exited with a non-zero exit code 143 
Killed by external signal 

16/12/06 19:44:08 ERROR YarnClusterScheduler: Lost executor 1 on hdp4: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 
Container exited with a non-zero exit code 143 
Killed by external signal 

16/12/06 19:44:08 WARN TaskSetManager: Lost task 1.0 in stage 12.0 (TID 19, hdp4): ExecutorLostFailure (executor 1 exited caused by one of the running tasks) Reason: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 
Container exited with a non-zero exit code 143 
Killed by external signal 

我沒有看到這個錯誤之前的任何警告或錯誤日誌。 問題是什麼?我應該在哪裏尋找內存消耗? 我看不到任何東西存儲 SparkUI的選項卡。 日誌從紗資源管理器UI採取HDP 2.5

編輯 看着在容器日誌,好像它是一個java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道如何增加內存,但我不沒有任何記憶了。 如何在沒有出現此錯誤的情況下使用4個數據框執行笛卡爾/產品連接?所有容器的

+0

如果數據框的大小與您所建議的一樣(5e6,100,100,100),則笛卡爾產品將具有大約5e12條記錄,即5萬億條記錄。您沒有提及列的數量,但是如果您有一個整數列,這將需要數TB的存儲空間。如果你有多個列,聯合數據庫可能需要數百或數千兆字節。這真的是你想要的嗎? – abeboparebop

+0

1欄。這是一個數據生成器工具,導致內存爆炸。 –

回答

1

日誌文件,我可上

yarn logs -applicationId application_1480922439133_0845_02 

如果你只是想AM日誌,

yarn logs -am -applicationId application_1480922439133_0845_02 

如果你想找到的容器跑了這份工作,

yarn logs -applicationId application_1480922439133_0845_02|grep container_e33_1480922439133_0845_02 

如果您只想要一個容器日誌,請點擊這裏

yarn logs -containerId container_e33_1480922439133_0845_02_000002 

爲了使這些命令起作用,必須將日誌聚合設置爲true,否則必須從各個服務器目錄獲取日誌。

更新 除了嘗試交換外,沒有什麼可以做,但會降低性能。

GC開銷限制意味着GC已連續運行,但無法恢復太多內存。唯一的原因是,任一代碼都寫得不好,並有大量的反向引用(這是可疑的,因爲你正在做簡單的連接),或者內存容量已經達到。

+0

感謝您的幫助,我已經找出了什麼問題。如果你知道如何解決它,我會非常感激(我正在更新這個問題) –

0

我也遇到了這個問題,並嘗試通過引用一些博客來解決它。 1.運行火花添加CONF波紋管:

--conf 'spark.driver.extraJavaOptions=-XX:+UseCompressedOops -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps' \ 
--conf 'spark.executor.extraJavaOptions=-XX:+UseCompressedOops -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC ' \ 
  • 當JVM GC,你會得到遵循消息:
  • Heap after GC invocations=157 (full 98): 
    PSYoungGen  total 940544K, used 853456K [0x0000000781800000, 0x00000007c0000000, 0x00000007c0000000) 
        eden space 860160K, 99% used [0x0000000781800000,0x00000007b5974118,0x00000007b6000000) 
        from space 80384K, 0% used [0x00000007b6000000,0x00000007b6000000,0x00000007bae80000) 
        to space 77824K, 0% used [0x00000007bb400000,0x00000007bb400000,0x00000007c0000000) 
    ParOldGen  total 2048000K, used 2047964K [0x0000000704800000, 0x0000000781800000, 0x0000000781800000) 
        object space 2048000K, 99% used [0x0000000704800000,0x00000007817f7148,0x0000000781800000) 
    Metaspace  used 43044K, capacity 43310K, committed 44288K, reserved 1087488K 
        class space used 6618K, capacity 6701K, committed 6912K, reserved 1048576K 
    } 
    
  • PSYoungGen和ParOldGen都是99%,那麼你將得到java.lang.OutOfMemoryError:如果創建了更多的對象,則超出了GC開銷限制 。

  • 嘗試添加更多的內存爲您的遺囑執行人或你的驅動程序時,更多的內存資源可供選擇:

  • --executor-memory 10000m \
    --driver-memory 10000m \

  • 對於我的情況:內存PSYoungGen ParOldGen會導致很多年輕對象進入ParOldGen內存區域,並且最終會導致ParOldGen不可用。所以java.lang.OutOfMemoryError:出現Java堆空間錯誤。對於執行

  • 添加的conf:

  • 'spark.executor.extraJavaOptions=-XX:NewRatio=1 -XX:+UseCompressedOops -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps '

    -XX:NewRatio =率 率= ParOldGen/PSYoungGen

    它dependends.You可以嘗試像

    -XX:+UseSerialGC :Serial Collector 
    -XX:+UseParallelGC :Parallel Collector 
    -XX:+UseParallelOldGC :Parallel Old collector 
    -XX:+UseConcMarkSweepGC :Concurrent Mark Sweep 
    
    GC策略

    Java Concurrent and Parallel GC

    1. 如果第4步和第6步都完成但仍然出錯,則應考慮更改您的代碼。例如,減少ML模型中的迭代器次數。