YARN動態資源池配置案例

EDH作爲統一的企業級數據中心,往往是一個多租戶的應用環境。在該環境中,不同用戶會同時使用集羣資源。如何保證用戶數據不被任意篡改?如何保證任務的權限控制 (例如用戶A不能任性地取消用戶B的任務)?如何確保用戶資源使用不超過他們的配額?

1. 開啓HDFS權限檢查 (默認是開啓的)
YARN動態資源池配置案例

"Check HDFS Permissions"選中

2. 在集羣中創建新用戶,以cloudera-dev爲例
 # 增加用戶組
 [root]$ groupadd cloudera-dev
 # 增加用戶
 [root]$ useradd -g cloudera-dev cloudera-dev
 # 查看用戶 cloudera-dev 所屬的所有組
 [root]$ groups cloudera-dev

 # Hadoop 創建相應的用戶目錄
 [root]$ sudo -u hdfs hdfs dfs -mkdir /user/cloudera-dev
 [root]$ sudo -u hdfs hdfs dfs -chown cloudera-dev:cloudera-dev /user/cloudera-dev 
一般而言,創建新用戶會在集羣中每臺機器上都創建同樣的用戶。不過理論上,爲了運行該案例,只需要在安裝了資源管理器 (Resource Manager) 的機器上創建相應用戶即可。CDH默認情況下使用whoami獲取用戶的信息,bash -c groups xxx 獲取用戶與組之間的映射關係,並使用這兩份信息進行ACL驗證

3. 運行第一個MapReduce示例程序 "word count"
 [root]$ su cloudera-dev
 [cloudera-dev]$ echo "Hello World Bye World" > file0
 [cloudera-dev]$ echo "Hello Hadoop Goodbye Hadoop" > file1
 [cloudera-dev]$ hdfs dfs -mkdir -p /user/cloudera-dev/wordcount/input
 [cloudera-dev]$ hdfs dfs -put file* /user/cloudera-dev/wordcount/input
 [cloudera-dev]$ hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-examples.jar wordcout wordcount/input wordcount/output
 [cloudera-dev]$ hdfs dfs -getmerge wordcount/output output.txt
 [cloudera-dev]$ cat output.txt
 Bye 1
 Hadoop 2
 Hello 2
 Goodbye 1
 World 2

4. 開啓資源管理器ACL並設置相應的管理ACL (Admin ACL)
YARN動態資源池配置案例

其中yarn.acl.enable默認值爲true。而對於yarn.admin.acl默認值爲*,意味着所有人都可以提交任務、管理已提交 (比如取消 kill) 的任務。格式爲 "以逗號分隔的用戶列表+空格+以逗號分隔的用戶組列表",例如 "user1,user2 group1,group2"。如果只有組信息,需要在最前端加入一個空格,例如" group1,group2"。另外特別需要注意的是必須將"yarn"加入到用戶列表中,默認安裝CDH後,有關YARN服務的命令會以yarn用戶的身份進行運行,若yarn不設置於yarn.admin.acl中,可能出現權限相關的錯誤 (例如刷新動態資源池)。

在該示例中,yarn.admin.acl列表中包含一個用戶yarn以及一個組cloudera-dev

5. 關閉未聲明資源池的自動生成
YARN動態資源池配置案例

默認情況下,"Allow Undeclared Pools"可選項是選中的,需要關閉。否則如果用戶指定一個尚未聲明的資源池時,比如prod,YARN將會自動生成一個prod資源池。配置文件修改後需要重新啓動YARN服務,重新部署客戶端配置。

6. 配置“若用戶提交任務不指定特定的queue,就使用default queue
YARN動態資源池配置案例

默認情況下,“Fair Scheduler User As Default Queue”可選項是選中的,意味着如果用戶提交任務時如果不指定特定的queue,就使用以用戶命名的queue。必須取消該選項。

7. 進入動態資源池 (Dynamic Resource Pools) 配置頁面
YARN動態資源池配置案例

訪問動態資源池管理頁面
YARN動態資源池配置案例

選擇配置選項 (Configuration,右上角)
YARN動態資源池配置案例

Resource Pools: 展示了當前資源池的分配情況,默認情況下,只有一個資源池 root.default。在該示例中,dev 是自定義的資源池。權重 (weight) 定義了資源池之間分配資源的比例。示例中,dev設置權重爲4而 default 的權重爲1,那麼集羣資源的 80% 會被分配給 dev。注意,這裏提到的資源分配不是一個靜態的概念,例如當前資源池 dev 中沒有任務正在運行,那麼資源池 default 是允許使用超過20%的集羣資源,比如50%。

8. 爲資源池 root 配置資源池 ACL
點擊資源池 root 對應的 "Edit" 按鈕
YARN動態資源池配置案例

在通用 (General) 欄,設置資源池 root 的調度算法,一般使用默認的DRF
YARN動態資源池配置案例

在YARN欄,設置資源池權重,資源約束等
YARN動態資源池配置案例

在提交訪問控制 (Submission Access Control) 欄設置哪些用戶或用戶組可以向該資源池提交任務
YARN動態資源池配置案例

在管理訪問控制 (Administration Access Control) 欄設置哪些用戶或用戶組可以對資源池中的任務進行管理
YARN動態資源池配置案例

9. 爲資源池 dev 配置資源池 ACL
可以使用與 root 相同的ACL配置,也可以使用不同的配置,該示例假設使用相同的設置。

10. 測試
測試一:用戶 root 向資源池 dev 提交 word count 任務
 [root]$ hadoop jar wordcount-0.9.0.jar com.cloudera.example.WordCount -Dmapreduce.job.queuename=dev wordcount/input wordcount/output
 ...
 Exception in thread "main" java.io.IOException: Failed to run job: User root cannot submit applications to queue root.dev
 ...
注意:這裏的word count是自定義的,與CDH自帶的word count示例的唯一區別在於,自定義word count的Mapper程序在運行時首先使用Thread.sleep (300 * 1000) 休眠5分鐘。這主要是爲了後續對資源池管理的測試

測試二:用戶 root 取消用戶 cloudera-dev 提交的、運行於資源池 dev 中的 word count 任務
用戶cloudera-dev向資源池dev提交word count任務
 [cloudera-dev]$ hadoop jar wordcount-0.9.0.jar com.cloudera.example.WordCount -Dmapreduce.job.queuename=dev wordcount/input wordcount/output
 ...

用戶root查詢相應任務的id,假設獲得任務id爲job_1421512955131_0006
 [root]$ hadoop job -list
 ...

用戶root取消 (kill) 該任務
 [root]$ hadoop job -kill job_1421512955131_0006
 ...
 Exception in thread "main" java.io.IOException: org.apache.hadoop.yarn.exceptions.YarnException: Java.security.AccessControlException: User root cannot perform operation MODIFY_APP on application
_1421512955131_0006
 ...

測試三:用戶 alex (屬於組 cloudera-dev) 取消用戶 cloudera-dev 提交的、運行於資源池 dev 中的 word count 任務
增加用戶alex,設置所屬組cloudera-dev
 [root]$ useradd -g cloudera-dev alex

用戶cloudera-dev向資源池dev提交word count任務
 [cloudera-dev]$ hadoop jar wordcount-0.9.0.jar com.cloudera.example.WordCount -Dmapreduce.job.queuename=dev wordcount/input wordcount/output
 ...
 

用戶alex查詢相應任務的id,假設獲得任務id爲job_1421512955131_0006
 [alex]$ hadoop job -list
 ...

用戶alex取消 (kill) 該任務
 [alex]$ hadoop job -kill job_1421512955131_0006
 ...
 INFO impl.YarnClientImpl: Killed application 
application_1421512955131_0006
 Killed job job_1421512955131_0006
 ...

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