Flink 使用之 Yarn 資源問題排查 Flink 使用介紹相關文檔目錄 前言 典型報錯 確定Flink使用的資源 Yarn資源相關配置 Flink資源計算方法 參考鏈接

Flink 使用介紹相關文檔目錄

Flink 使用介紹相關文檔目錄

前言

Flink作業提交的時候會遇到任務無法提交,或者是長時間處於ACCEPTED狀態。此時需要重點排查Yarn的資源的相關配置。

本篇爲大家帶來Flink on Yarn 資源問題的排查思路。

典型報錯

Flink on Yarn程序提交的時候如果資源不足,JobManager會出現類似如下的錯誤:

java.util.concurrent.CompletionException: org.apache.flink.runtime.jobmanager.scheduler.NoResourceAvailableException: Slot request bulk is not fulfillable! Could not allocate the requeired slot within slot request timeout

根因是Yarn的資源不足,或者是超過配置限制。

確定Flink使用的資源

首先需要根據Flink配置文件,或者作業的提交命令,確定Flink的資源配置,以及作業提交到了哪個隊列,是否指定了node label或者指定了哪個node label。

使用Yarn session提交的Flink作業,注意檢查的參數有:

  • -s: 每個TaskManager的slot數量。
  • -qu: 提交任務到哪個隊列。
  • -nl: 作業使用的Yarn標籤資源。
  • -jm: JobManager使用的內存。
  • -tm: TaskManager使用的內存。

Yarn cluster模式:

  • -ys: 每個TaskManager的slot數量。
  • -yqu: 提交任務到哪個隊列。
  • -ynl: 作業使用的Yarn標籤資源。
  • -yjm: JobManager使用的內存。
  • -ytm: TaskManager使用的內存。

另外提交作業時還有:

  • -p: 指定提交作業時的默認並行度。如果作業內算子沒有明確指定並行度,則使用該值。覆蓋parallelism.default配置值。

flink-conf.yaml配置文件:

  • taskmanager.numberOfTaskSlots: TaskManager slot數量。
  • parallelism.default: 默認的並行度。決定會啓動多少個TaskManager。
  • jobmanager.memory.process.size: JobManager總內存大小。包含堆內,堆外以及JVM metaspace等JVM本身佔用的內存大小。
  • taskmanager.memory.process.size: TaskManager總內存大小。

Yarn資源相關配置

本節列出了需要重點檢查Yarn的配置。

內存相關:

  • yarn.nodemanager.resource.memory-mb: 每個nodemanager最多可用於分配給container的內存數量。整個Yarn集羣的可用內存數量爲yarn.nodemanager.resource.memory-mb * nodemanager節點數。
  • yarn.scheduler.minimum-allocation-mb: RM爲每個container分配的最小內存數。container佔用內存大小的下限。
  • yarn.scheduler.maximum-allocation-mb: RM爲每個container分配的最大內存數。container佔用內存大小的上限。

CPU相關:

  • yarn.nodemanager.resource.percentage-physical-cpu-limit: CPU資源可供container使用的百分比。僅在啓用CGroup(yarn_cgroups_enabled)的時候纔會生效。
  • yarn.nodemanager.resource.cpu-vcores: 每個nodemanager最多可用於分配給container的CPU vcore數量。整個Yarn集羣的可用CPU vcore數量爲yarn.nodemanager.resource.cpu-vcores * nodemanager節點數。
  • yarn.scheduler.minimum-allocation-vcores: RM爲每個container分配的最小CPU vcore數。container佔用vcore數量的下限。
  • yarn.scheduler.maximum-allocation-vcores:RM爲每個container分配的最大CPU vcore數。container佔用vcore數量的上限。

容量調度資源配置:

  • yarn.scheduler.capacity.<queue-path>.capacity: 隊列的最小資源數。發生強佔的時候也需要保障隊列的最小資源。
  • yarn.scheduler.capacity.<queue-path>.maximum-capacity: 隊列的最大資源數。在其他隊列資源不緊張的情況下可以使用超過yarn.scheduler.capacity.<queue-path>.capacity的資源。
  • yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent: 確保用戶可獲得的最小資源佔隊列資源的百分比。
  • yarn.scheduler.capacity.<queue-path>.user-limit-factor: 單個用戶最多可使用的資源佔隊列總資源(最小資源)的百分比。
  • yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb: 隊列中每個container分配的最大內存數。覆蓋yarn.scheduler.maximum-allocation-mb配置。必須小於或等於集羣配置。
  • yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores: 隊列中每個container分配的最大CPU vcore數。覆蓋yarn.scheduler.maximum-allocation-vcores配置。必須小於或等於集羣配置。
  • yarn.scheduler.capacity.<queue-path>.user-settings.<user-name>.weight: 某個用戶的資源分配權重值。權重大的用戶分得的資源較多。

容量調度應用限制配置:

  • yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity.<queue-path>.maximum-applications: 集羣或者隊列最多可同時存在的running和pending應用數量。該項是硬限制。超過數量限制之後提交的應用會被拒絕。
  • yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent: 集羣或隊列中可用於運行Application Master的資源佔比。
  • yarn.scheduler.capacity.max-parallel-apps / yarn.scheduler.capacity.<queue-path>.max-parallel-apps: 同樣限制最大同時運行應用數但該配置是軟限制(集羣範圍或隊列範圍)。超過數量限制之後提交的應用處於ACCEPTED狀態,等待條件符合時運行。
  • yarn.scheduler.capacity.user.max-parallel-apps: (所有用戶範圍)每個用戶最多提交的應用數。軟限制。
  • yarn.scheduler.capacity.user.<username>.max-parallel-apps: 某個用戶最多提交的應用數。軟限制。

資源限制檢查順序:

Hadoop官網的解釋如下:

  1. maximum-applications check - if the limit is exceeded, the submission is rejected immediately.
  2. max-parallel-apps check - the submission is accepted, but the application will not transition to RUNNING state. It stays in ACCEPTED until the queue / user limits are satisfied.
  3. maximum-am-resource-percent check - if there are too many Application Masters running, the application stays in ACCEPTED state until there is enough room for it.

中文解釋爲:

  1. 檢查maximum-applications。如果超出,拒絕作業提交。(硬限制)
  2. 檢查max-parallel-apps。如果超出,作業進入ACCEPTED狀態,等到條件滿足時候恢復執行。(軟限制)
  3. 檢查maximum-am-resource-percent。如果超出,作業進入ACCEPTED狀態,等到條件滿足時候恢復執行。(軟限制)

權限配置:

  • yarn.scheduler.capacity.<queue-path>.state: 隊列狀態。可以是RUNNING或者STOPPED。STOPPED狀態禁止提交新應用,但是已經提交的應用可以繼續運行直到結束。

標籤調度相關:

Yarn的節點可以被綁定標籤。從而可以限制Yarn作業調度的物理節點。當然也能夠對作業資源進行限制。需要注意的是沒有綁定任何標籤的節點自成一類,他們能夠被所有隊列使用到。

使用yarn node -list -showDetails命令查看Yarn集羣節點和節點綁定的label。通過綁定某個label的節點數和前面所述的節點可用內存和vcore配置,可以計算出該label納管的資源最大值。

隊列標籤配置:

  • yarn.scheduler.capacity.root.accessible-node-labels: 隊列可訪問哪些標籤資源。無標籤的節點資源所有隊列都可以訪問。
  • yarn.scheduler.capacity.root.default-node-label-expression: 如果提交到該隊列的app沒有指定標籤,則使用default-node-label-expression指定的標籤資源。默認情況下該配置項爲空,表示app將使用沒有標籤的節點。此項很重要,否則當用戶提交應用沒有指定標籤時,即便指定了隊列,標籤資源仍然不可使用。

如果隊列標籤配置錯誤或者是用戶提交應用時候使用的標籤配置有誤,很有可能導致應用無法獲得足夠的資源,最終無法運行。

Flink資源計算方法

TaskManager數量 = 向上取整(parallelism.default或者實際運行時指定的並行度 / taskmanager.numberOfTaskSlots)

如果各算子並行度不同,parallelism取用並行度最大的算子並行度。

總的Container數量 = 1 + TaskManager數量。

其中1是JobManager(AppMaster角色),它自己佔用一個container。

相關Yarn配置:

  • yarn.nodemanager.resource.memory-mb * nodemanager節點數(集羣總可用內存數)。
  • yarn.nodemanager.resource.cpu-vcores * nodemanager節點數(集羣總可用vcore數)。
  • yarn.scheduler.capacity.<queue-path>.capacity
  • yarn.scheduler.capacity.<queue-path>.maximum-capacity
  • yarn.scheduler.capacity.root.accessible-node-labels
  • yarn.scheduler.capacity.root.default-node-label-expression

需要檢查目標隊列的剩餘資源是否能夠滿足作業需要。


每個container的vcore使用量 = taskmanager.numberOfTaskSlots或者-s參數。

相關Yarn配置:

  • yarn.scheduler.minimum-allocation-vcores
  • yarn.scheduler.maximum-allocation-vcores

JobManager container內存使用量 = jobmanager.memory.process.size或者-jm參數。

因爲JobManager在Yarn中的角色是AppMaster,因此它的資源使用量受到了yarn.scheduler.capacity.maximum-am-resource-percent配置項的限制。

除此之外還有:

  • yarn.scheduler.minimum-allocation-mb
  • yarn.scheduler.maximum-allocation-mb
  • yarn.scheduler.capacity.<queue-path>.user-limit-factor

TaskManager container內存使用量 = taskmanager.memory.process.size或者-tm參數。

相關Yarn配置:

  • yarn.scheduler.minimum-allocation-mb
  • yarn.scheduler.maximum-allocation-mb
  • yarn.scheduler.capacity.<queue-path>.user-limit-factor

參考鏈接

https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

https://zhuanlan.zhihu.com/p/335881182

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章