不能傳圖了怎么辦?
962
2022-05-29
1.案情
很單純的講,就是一個spark程序以yarn-cluster的模式運行在yarn集群上,經常遇到Lost executor? ?Container be killed by yarn for exceed memory limits
2.spark大致架構
3、案發現場
從日志可以看出,Container被殺掉,Executor丟失,導致stage中的task也失敗,大致原因可以看出,堆內存基本被全部用完,同時建議設置spark.yarn.executor.memoryOverhead。
想要解決問題,首先得明白container,executor,task之間的資源分配以及相互關系,才能知道怎么合理調整資源使得任務順利運行。
4.yarn資源分配
當spark任務運行在yarn集群上時,Yarn的ResourceMananger用來管理集群資源,集群上每個節點上的NodeManager用來管控所在節點的資源,從yarn的角度來看,每個節點看做可分配的資源池,當向ResourceManager請求資源時,NodeManager將會以execution container的資源形式返回,其實就是個JVM進程,提供了任務運行的各種資源,主要包括,cpu,內存,磁盤IO/網絡等資源。
想必大家會有以下疑問
1、??container資源來自何方?
從上述可以知道,container資源來自于NodeManager的資源分配,來自于node節點。
2、??一個Container可以分配多少個executor?
參數yarn.nodemanager.resource.memory-mb,該參數是設置nodemanager申請到用于所有container的內存總量,單位為M。
在yarn集群上,可以通過參數executor-nums指定executor個數,executor-memory指定每個executor的內存大小,默認為1G,因此,一個Container可以分配的executor個數 = container的內存大小/executor-memory內存值。
其中,每個executor可用的內存主要由分配的堆內存和堆外內存構成,堆內存即executor-memory,堆外存由默認值和設置值來決定,即Max(executor-memory*0.1,384M)即為該executor的堆外內存。
3、任務并行度
yarn集群上,可以通過設置executor-nums和executor-cores來設置Job的task并行度,如果設置了50個executor,每個ececutor3核,即job的每個stage理論上都會有150個task并行運行,但是如果設置了參數spark.defalut.parallelism,真正的并行度為Min(spark.defalut.parallelism,150),這里暫時不討論并行度的合理設置。
5. 案情分析
Container進程被殺掉,因為executor的內存使用超過了Container的內存總量;task運行在executor中的時候,使用的內存可能會超過executor-memory,所以會為executor額外預留一部分內存,即日志里面提示的spark.yarn.executor.memoryOverhead代表了這部分內存,如果沒有設置就會根據公式自動計算:
其中,MEMORY_OVERHEAD_FACTOR默認為0.1,executorMemory為設置的executor-memory, MEMORY_OVERHEAD_MIN默認為384m。參數MEMORY_OVERHEAD_FACTOR和MEMORY_OVERHEAD_MIN一般不能直接修改。
主要原因還是executor的內存不足引起的,解決方法如下:
1、如果集群資源充足,可以適當增大executor-memory,如果executor內存充足就不會使用到堆外內存,該方法利用充足的資源換取了性能。
2、如果集群資源有限,可以適當降低executor內task的并行度,使得executor消耗的內存變小,犧牲了部分性能換取任務的順利運行。
3、配置參數spark.yarn.executor.memoryOverhead,增加executor可利用的總內存,一般建議設置為原來memoryOverhead倍數。
6.總結
遇到spark中executor task運行資源不足的情況,在無性能問題的前提下可以根據數據計算量適當增加內存滿足需求,在一定范圍內,增加資源的分配與性能的提升是成正比的。但是也得考慮自身實際情況,權衡資源和性能,資源充足可以用資源換性能,資源有限,優先保障功能正常運行。
軟件開發 云計算
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。