2017-01-12 55 views
0

我有一個4節點的Spark Standalone羣集,並在其上運行Spark Streaming作業。當我增加資源時Spark Streaming Job OOM

當我提交作業,每個執行人一切的7芯平穩運行:

spark-submit --class com.test.StreamingJob --supervise --master spark://{SPARK_MASTER_IP}:7077 --executor-memory 30G --executor-cores 7 --total-executor-cores 28 /path/to/jar/spark-job.jar 

當我增加至執行人沒有一個批次的24個核心得到處理,我看到java.lang.OutOfMemoryError:無法在執行器日誌中創建新的本地線程。執行人則持續出現故障:

spark-submit --class com.test.StreamingJob --supervise --master spark://{SPARK_MASTER_IP}:7077 --executor-memory 30G --executor-cores 24 --total-executor-cores 96 /path/to/jar/spark-job.jar 

錯誤:

17/01/12 16:01:00 ERROR SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[Shutdown-checker,5,main] 
java.lang.OutOfMemoryError: unable to create new native thread 
     at java.lang.Thread.start0(Native Method) 
     at java.lang.Thread.start(Thread.java:714) 
     at io.netty.util.concurrent.SingleThreadEventExecutor.shutdownGracefully(SingleThreadEventExecutor.java:534) 
     at io.netty.util.concurrent.MultithreadEventExecutorGroup.shutdownGracefully(MultithreadEventExecutorGroup.java:146) 
     at io.netty.util.concurrent.AbstractEventExecutorGroup.shutdownGracefully(AbstractEventExecutorGroup.java:69) 
     at com.datastax.driver.core.NettyOptions.onClusterClose(NettyOptions.java:190) 
     at com.datastax.driver.core.Connection$Factory.shutdown(Connection.java:844) 
     at com.datastax.driver.core.Cluster$Manager$ClusterCloseFuture$1.run(Cluster.java:2488) 

我發現這個question並試圖大幅加大了ulimits,但它沒有任何效果。

每個盒子有32個核心和61.8 GB的內存。流式作業是用java編寫的,運行在Spark 2.0.0上,並通過spark-cassandra-connector-java_2.10 1.5.0-M2連接到Cassandra 3.7.0。

數據是一個非常小的每秒少於100個事件的涓流,每個事件都小於200B。

+0

數據的大小是多少?您能夠檢查羣集中每個節點的總RAM和每個節點的內核數量嗎? –

+0

所以問題是你爲每個執行器分配24個executor核心/機器和30GB內存。所以你分配720GB的總內存。你的集羣只有247GB的內存,因此你的內存異常情況下出現:) –

+0

@ sandeep-singh每個工人只有一個執行器。這些是每個執行者的限制。 – Kevin

回答

0

聽起來像你內存不足;)。

有關更多詳細信息,Spark使用的核心數與直接並行處理的信息量直接相關。基本上,你可以將每個Core思考爲處理完整的Spark分區數據,並可能需要將全部內容駐留在內存中。

7每個執行程序的內核意味着7個Spark分區正在同時處理。 將此數字提高到24意味着將使用大約4倍的RAM。這很容易在各個地方造成OOM。

有幾種方法可以解決這個問題。

  1. 分配更多的內存來執行人的JVM
  2. 收縮星火分區的大小(小的分區,在任何給定的時間意味着更少的內存數據)
  3. 確保您不會在內存緩存任何RDDS (並因此耗盡系統資源)
  4. 減少您正在使用的數據量,獲取子集或嘗試在擊中spark之前在服務器上進行篩選。
+0

感謝Russ,我會嘗試縮小分區。這種情況即使在很少的數據需要處理時也會發生,所以我不認爲這是可能的。 – Kevin

+0

hi Russ,在獨立羣集模式下,如何爲Executes分配更多的內存? –

+0

該文檔總是有益的 https://spark.apache.org/docs/latest/configuration.html#application-properties spark.executor.memory \t \t1克的內存量每執行過程中使用(例如2克,8g)。 – RussS

相關問題