yarn使用cgroup隔離cpu資源

yarn使用cgroup隔離cpu資源

yarn默認只管理內存資源,雖然也可以申請cpu資源,但是在沒有cpu資源隔離的情況下效果並不是太好.在集羣規模大,任務多時資源競爭的問題尤爲嚴重.
還好yarn提供的LinuxContainerExecutor可以通過cgroup來隔離cpu資源

cgroup

cgroup是系統提供的資源隔離功能,可以隔離系統的多種類型的資源,yarn只用來隔離cpu資源

安裝cgroup

默認系統已經安裝了cgroup了,如果沒有安裝可以通過命令安裝
CentOS 6

yum install -y libcgroup

CentOS 7

yum install -y libcgroup-tools

然後通過命令啓動
CentOS 6

/etc/init.d/cgconfig start

CentOS 7

systemctl start cgconfig.service

查看/cgroup目錄,可以看到裏面已經創建了一些目錄,這些目錄就是可以隔離的資源


 
  1. drwxr-xr-x 2 root root 0 3月 19 20:56 blkio

  2. drwxr-xr-x 3 root root 0 3月 19 20:56 cpu

  3. drwxr-xr-x 2 root root 0 3月 19 20:56 cpuacct

  4. drwxr-xr-x 2 root root 0 3月 19 20:56 cpuset

  5. drwxr-xr-x 2 root root 0 3月 19 20:56 devices

  6. drwxr-xr-x 2 root root 0 3月 19 20:56 freezer

  7. drwxr-xr-x 2 root root 0 3月 19 20:56 memory

  8. drwxr-xr-x 2 root root 0 3月 19 20:56 net_cls

如果目錄沒有創建可以執行


 
  1. cd /

  2. mkdir cgroup

  3. mount -t tmpfs cgroup_root ./cgroup

  4. mkdir cgroup/cpuset

  5. mount -t cgroup -ocpuset cpuset ./cgroup/cpuset/

  6. mkdir cgroup/cpu

  7. mount -t cgroup -ocpu cpu ./cgroup/cpu/

  8. mkdir cgroup/memory

  9. mount -t cgroup -omemory memory ./cgroup/memory/

通過cgroup隔離cpu資源的步驟爲

  1. 在cpu目錄創建分組
    cgroup以組爲單位隔離資源,同一個組可以使用的資源相同
    一個組在cgroup裏面體現爲一個文件夾,創建分組直接使用mkdir命令即可.
    組下面還可以創建下級組.最終可以形成一個樹形結構來完成複雜的資源隔離方案.
    每當創建了一個組,系統會自動在目錄立即創建一些文件,資源控制主要就是通過配置這些文件來完成
    
     
    1. --w--w--w- 1 root root 0 3月 19 21:09 cgroup.event_control

    2. -rw-r--r-- 1 root root 0 3月 19 21:09 cgroup.procs

    3. -rw-r--r-- 1 root root 0 3月 19 21:09 cpu.cfs_period_us

    4. -rw-r--r-- 1 root root 0 3月 19 21:09 cpu.cfs_quota_us

    5. -rw-r--r-- 1 root root 0 3月 19 21:09 cpu.rt_period_us

    6. -rw-r--r-- 1 root root 0 3月 19 21:09 cpu.rt_runtime_us

    7. -rw-r--r-- 1 root root 0 3月 19 21:09 cpu.shares

    8. -r--r--r-- 1 root root 0 3月 19 21:09 cpu.stat

    9. -rw-r--r-- 1 root root 0 3月 19 21:09 notify_on_release

    10. -rw-r--r-- 1 root root 0 3月 19 21:09 tasks

    yarn默認使用hadoop-yarn組作爲最上層,任務運行時yarn會爲每個container在hadoop-yarn裏面創建一個組
    yarn主要使用cpu.cfs_quota_us cpu.cfs_period_us cpu.shares3個文件
    yarn使用cgroup的兩種方式來控制cpu資源分配
    1. 嚴格按核數隔離資源
      可使用核數 = cpu.cfs_quota_us/cpu.cfs_period_us
      在yarn中cpu.cfs_quota_us被直接設置爲1000000(這個參數可以設置的最大值)
      然後根據任務申請的core來計算出cpu.cfs_period_us
    2. 按比例隔離資源
      按每個分組裏面cpu.shares的比率來分配cpu
      比如A B C三個分組,cpu.shares分別設置爲1024 1024 2048,那麼他們可以使用的cpu比率爲1:1:2
  2. 將進程id添加到指定組的tasks文件
    創建完分組後只需要將要限制的進程的id寫入tasks文件即可,如果需要解除限制,在tasks文件刪除即可

yarn配置

啓動cgroup需要配置幾個配置文件

etc/hadoop/yarn-site.xml配置

可以參考http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeManagerCgroups.html 配置
這些配置大部分都是固定配置


 
  1. <property>

  2. <name>yarn.nodemanager.container-executor.class</name>

  3. <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>

  4. </property>

  5. <property>

  6. <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name>

  7. <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value>

  8. </property>

  9. <property>

  10. <description>yarn使用的cgroup組,默認爲/hadoop-yarn</description>

  11. <name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name>

  12. <value>/hadoop-yarn</value>

  13. </property>

  14. <property>

  15. <description>是否自動掛載cgroup</description>

  16. <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>

  17. <value>true</value>

  18. </property>

  19. <property>

  20. <description>cgroup掛載目錄, /sys/fs/cgroup 或者是 /cgroup,目錄和系統有關</description>

  21. <name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>

  22. <value>/cgroup</value>

  23. </property>

  24. <property>

  25. <name>yarn.nodemanager.linux-container-executor.group</name>

  26. <value>hadoop</value>

  27. </property>

  28. <property>

  29. <description>配置nodemanager使用多少物理cpu資源,比如24核服務器配置90的話,最近使用21.6核</description>

  30. <name>yarn.nodemanager.resource.percentage-physical-cpu-limit</name>

  31. <value>90</value>

  32. </property>

  33. <property>

  34. <description>是控制是否嚴格限制cpu,即按任務申請的core限制,還是非嚴格限制,即按core的比率限制</description>

  35. <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>

  36. <value>true</value>

  37. </property>

  38. <property>

  39. <description>非安全模式將會以這裏設置的用戶運行container,比如配置hadoop用戶則以hadoop運行container</description>

  40. <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user</name>

  41. <value>hadoop</value>

  42. </property>

etc/hadoop/container-executor.cfg配置

這個配置文件每項都需要填,要不然會報錯


 
  1. yarn.nodemanager.linux-container-executor.group=hadoop

  2. banned.users=root

  3. min.user.id=1000

  4. allowed.system.users=hadoop

權限設置

在配置中文件的權限有特殊要求


 
  1. chown root:hadoop bin/container-executor

  2. chmod 6050 bin/container-executor

系統還要求etc/hadoop/container-executor.cfg 的所有父目錄(一直到/ 目錄) owner 都爲 root
這個路徑是默認${HADOOP_HOME}/etc/hadoop/container-executor.cfg,如果不方便修改所有父級目錄爲root權限,可以重新編譯代碼到其他目錄,比如/etc/hadoop/目錄

mvn clean package -Dcontainer-executor.conf.dir=/etc/hadoop/ -DskipTests -Pnative

配置好以後檢測是否配置成功

./bin/container-executor --checksetup

如果沒有任何輸出表示配置成功
如果一切順利就可以啓動集羣了

測試cgroup

可以運行測試腳本測試系統


 
  1. ./bin/spark-submit \

  2. --class org.apache.spark.examples.SparkPi \

  3. --master yarn-cluster \

  4. --deploy-mode cluster \

  5. --num-executors 5 \

  6. --executor-cores 3 \

  7. --executor-memory 4G \

  8. --driver-memory 4G \

  9. --driver-cores 2 \

  10. lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000

查看系統是否生效只能登錄到服務器查看
通過top查看信息


查看是否創建了cgroup分組,ll /cgroup/hadoop-yarn/


 
  1. --w--w--w- 1 root root 0 3月 17 15:44 cgroup.event_control

  2. -rw-r--r-- 1 root root 0 3月 17 15:44 cgroup.procs

  3. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000011

  4. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000026

  5. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000051

  6. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000076

  7. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000101

  8. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000123

  9. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000136

  10. drwxr-xr-x 2 root root 0 3月 17 16:06 container_1489736876249_0003_01_000155

  11. drwxr-xr-x 2 root root 0 3月 17 16:30 container_1489736876249_0004_01_000008

  12. -rw-r--r-- 1 root root 0 3月 17 15:47 cpu.cfs_period_us

  13. -rw-r--r-- 1 root root 0 3月 17 15:47 cpu.cfs_quota_us

  14. -rw-r--r-- 1 root root 0 3月 17 15:44 cpu.rt_period_us

  15. -rw-r--r-- 1 root root 0 3月 17 15:44 cpu.rt_runtime_us

  16. -rw-r--r-- 1 root root 0 3月 17 15:44 cpu.shares

  17. -r--r--r-- 1 root root 0 3月 17 15:44 cpu.stat

  18. -rw-r--r-- 1 root root 0 3月 17 15:44 notify_on_release

  19. -rw-r--r-- 1 root root 0 3月 17 15:44 tasks

查看container_*目錄下 cpu.cfs_period_us,計算cpu.cfs_quota_us/cpu.cfs_period_us即可知道分配的核數


 
  1. [root@- ~]# cat /cgroup/cpu/hadoop-yarn/container*/cpu.cfs_period_us

  2. 462962

  3. 462962

  4. 462962

  5. 462962

  6. 462962

  7. 462962

  8. 462962

  9. 462962

  10. 308641

問題處理

配置的過程中免不了會碰上一些問題,以下是我碰到的問題

spark任務申請了core,node manager分配不正確,都是分配1個核

這個是由於目前使用的capacity scheduler的資源計算方式只考慮了內存,沒有考慮CPU
這種方式會導致資源使用情況統計不準確,比如一個saprk程序啓動命令資源參數如下

--num-executors 1 --executor-cores 3 --executor-memory 4G --driver-memory 4G --driver-cores 1

DefaultResourceCalculator 統計佔2核
DominantResourceCalculator 統計佔4核
修改配置文件即可解決


 
  1. <property>

  2. <name>yarn.scheduler.capacity.resource-calculator</name>

  3. <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>

  4. <description>

  5. The ResourceCalculator implementation to be used to compare

  6. Resources in the scheduler.

  7. The default i.e. DefaultResourceCalculator only uses Memory while

  8. DominantResourceCalculator uses dominant-resource to compare

  9. multi-dimensional resources such as Memory, CPU etc.

  10. </description>

  11. </property>

container-executor運行時報缺少GLIBC_2.14庫

container-executor: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by bin/container-executor)

這個和系統版本有關,只能通過重新編譯container-executor來解決

mvn clean package -Dcontainer-executor.conf.dir=/etc/hadoop/ -DskipTests -Pnative

centos 7系統container啓動報錯,不能寫入/cgroup/cpu

這個是yarn在centos 7下的一個bug,hadoop 2.8以後的版本纔會解決
這個bug主要是因爲centos 7下cgroup的目錄和centos 6不一致導致,centos 7 cpu目錄合併成cpu,cpuacct, 這個,導致的錯誤,需要打補丁後編譯https://issues.apache.org/jira/browse/YARN-2194


 
  1. private String findControllerInMtab(String controller,

  2. Map<String, List<String>> entries) {

  3. for (Entry<String, List<String>> e : entries.entrySet()) {

  4. // if (e.getValue().contains(controller))

  5. // return e.getKey();

  6.  
  7. if (e.getValue().contains(controller)) {

  8. String controllerKey = e.getKey();

  9. // In Redhat7, the controller is called "/sys/fs/cgroup/cpu,cpuacct"

  10. controllerKey = controllerKey.replace("cpu,cpuacct", "cpu");

  11. if (new File(controllerKey).exists()) {

  12. return controllerKey;

  13. }

  14. }

  15. }

  16.  
  17. return null;

  18. }

升級的風險

由於改變了資源的隔離方式,升級可能有幾個方面的影響

任務資源分配問題

升級cgroup後單個任務如果以前資源分配不合理可能會出現計算延時情況,出現資源問題時需要調整任務資源
在集羣規模小的時候可能沒有資源可以調整,那麼可以修改爲非嚴格模式,非嚴格模式不能按配置限制資源,只能保證資源不被少數進程全部佔用


 
  1. <property>

  2. <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>

  3. <value>false</value>

  4. </property

spark driver資源問題

spark任務的driver在集羣模式deploy-mode cluster時,如果沒有配置driver-cores的話默認分配1核,1核在任務規模大時有可能資源會緊張.採用deploy-mode client模式的不受cgroup限制

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