一、調度壓力模擬器介紹
最近在調研Yarn調度性能問題,考慮到線上集群規模已達到5k+台,在線上環境實驗是不太可行的,因此必須在線上有一套環境來驗證調度器的性能,才能把有效的優化策略推廣到線上環境。在線下環境搭建一套和線上規模相同的集群是不太合理的,需要耗費大量物理資源,成本耗費非常高。因此,需要有一個調度器的壓力模擬器,在不需要大量物理機資源的條件下,能夠模擬Yarn的調度過程。
Hadoop社區提供了開源調度器的壓力模擬工具——Scheduler Load Simulator。
yarn調度壓力模擬器
二、SLS使用
2.1 SLS介紹
SLS的功能實現主要在 /share/hadoop/tools/sls/ 中,SLS文件夾包括四個文件夾:bin,html,sample-conf,sample-data。
- bin: 包含了sls的運行腳本,也就是啟動命令
- html:包含html、css、js文件,來實現實時追蹤和web顯示。
- sample-conf:sls的配置文件
- sample-data:提供了一個rumen trace的示例文件,可以用來作為sls的輸入。
2.2 SLS參數
任務並發提交與任務並行運行相關參數:
2.3 SLS環境運行
$ cd opt/cloudera/parcels/CDH/share/hadoop/tools/sls/ $ bin/slsrun.sh --input-rumen|--input-sls=<TRACE_FILE1,TRACE_FILE2,...> --output-dir=<SLS_SIMULATION_OUTPUT_DIRECTORY> [--nodes=<SLS_NODES_FILE>] [--track-jobs=<JOBID1,JOBID2,...>] [--print-simulation]
參數介紹:
--input-rumen: 輸入是rumen trace文件,示例為/share/hadoop/tools/sls/sample-data/2jobs2min-rumen-jh.json.
--input-sls: 輸入是sls自己的格式文件,sls file。sls提供了一個工具來將rumen traces文件轉換為sls trace:rumen2sls.sh(/share/hadoop/tools/sls/bin/)。
--output-dir: 輸出監控數據和日志的目錄
--nodes: 集群的拓撲結構,默認情況下,sls采用input json file中的拓撲,用戶也可以指定一個新的拓撲結構。
--track-jobs: 在模擬器運行過程中跟蹤的特定任務,由逗號分隔。
--print-simulation: 該參數決定了是否在模擬器運行前打印仿真信息,包括每個應用程序的節點、應用程序、任務和信息的數量。如果需要,只需要添加上該參數即可。
$ cd opt/cloudera/parcels/CDH/share/hadoop/tools/sls/ // sls traces輸入 $ bin/slsrun.sh --input-sls=/root/cdh/sls/sls-jobs.json --nodes=/root/cdh/sls/sls-nodes.json --output-dir=/root/cdh/sls/output1 --print-simulation // rumen traces輸入 $ bin/slsrun.sh --input-rumen=/opt/cloudera/parcels/CDH/share/hadoop/tools/sls/sample-data/2jobs2min-rumen-jh.json --nodes=/root/cdh/sls/sls-nodes.json --output-dir=/root/cdh/sls/output2
為了兼容 rumen traces 文件類型的輸入,社區提供了一個腳本支持 rumen traces 轉換為 sls traces,使用方式如下:
$ cd opt/cloudera/parcels/CDH/share/hadoop/tools/sls/ $ bin/rumen2sls.sh --rumen-file=<RUMEN_FILE> --output-dir=<SLS_OUTPUT_DIRECTORY> [--output-prefix=<SLS_FILE_PREFIX>]
運行案例:
$ bin/rumen2sls.sh --rumen-file=/opt/cloudera/parcels/CDH/share/hadoop/tools/sls/sample-data/2jobs2min-rumen-jh.json --output-dir=/root/cdh/sls/
運行sls環境過程中踩過的坑:https://www.cnblogs.com/walker-/p/13331255.html
三、大規模集群環境模擬
$ cd opt/cloudera/parcels/CDH/share/hadoop/tools/sls/ $ bin/slsrunForRealRM.sh --input-rumen=/data/kwang/rumentrace/trace.big.json --nodes=/data1/kwang/nodes/nodes_10000.json --output-dir=/data1/kwang/rumentrace/output2
3.1 如何生成大量jobs文件?
hadoop jar \ /opt/cloudera/parcels/CDH/share/hadoop/tools/lib/hadoop-rumen-2.6.0-cdh5.14.4.jar \ org.apache.hadoop.tools.rumen.TraceBuilder \ -recursive \ file:///var/lib/hadoop-hdfs/rumentrace/job-trace.json \ # 輸出trace文件 file:///var/lib/hadoop-hdfs/rumentrace/job-topology.json \ # 輸出NM的拓撲文件 hdfs://nameservice/user/history/logs/ # mr歷史作業日志
3.2 如何構造10k規模NM節點?

import java.util.Random; public class RandomIp { public static String getRandomIp() { // ip范圍 int[][] range = { {607649792, 608174079}, // 36.56.0.0-36.63.255.255 {1038614528, 1039007743}, // 61.232.0.0-61.237.255.255 {1783627776, 1784676351}, // 106.80.0.0-106.95.255.255 {2035023872, 2035154943}, // 121.76.0.0-121.77.255.255 {2078801920, 2079064063}, // 123.232.0.0-123.235.255.255 {-1950089216, -1948778497}, // 139.196.0.0-139.215.255.255 {-1425539072, -1425014785}, // 171.8.0.0-171.15.255.255 {-1236271104, -1235419137}, // 182.80.0.0-182.92.255.255 {-770113536, -768606209}, // 210.25.0.0-210.47.255.255 {-569376768, -564133889}, // 222.16.0.0-222.95.255.255 }; Random random = new Random(); int index = random.nextInt(10); String ip = num2ip(range[index][0] + new Random().nextInt(range[index][1] - range[index][0])); return ip; } /* * 將十進制轉換成IP地址 */ public static String num2ip(int ip) { int[] b = new int[4]; String ipStr = ""; b[0] = (int) ((ip >> 24) & 0xff); b[1] = (int) ((ip >> 16) & 0xff); b[2] = (int) ((ip >> 8) & 0xff); b[3] = (int) (ip & 0xff); ipStr = Integer.toString(b[0]) + "." + Integer.toString(b[1]) + "." + Integer.toString(b[2]) + "." + Integer.toString(b[3]); return ipStr; } public static void main(String[] args) { int count = 100; for (int i = 0; i < count; i++) { String randomIp = getRandomIp(); System.out.println(randomIp); } } }
注意:在將10k節點NM信息向RM注冊時,需要在RM端允許未知host和ip信息向RM注冊,避免被RM拒絕。
<property> <name>yarn.resourcemanager.nodes.include-path</name> <value>/etc/hadoop/myconf/nodes_allow.txt</value> </property>
在active RM節點設置node白名單限制,允許所有節點向RM注冊。
$ >/etc/hadoop/myconf/nodes_allow.txt # 清空nodes_allow.txt文件,即允許所有節點向RM注冊 $ su - yarn 'yarn rmadmin -refreshNodes' # 刷新RM的Nodes列表信息