1 yarn
2 组件
| 角色 | 职责 |
|---|---|
| ResourceManager (RM) | 集群资源总管,负责接收应用、分配资源(Container) |
| NodeManager (NM) | 单机资源代理,负责启动/监控 Container,汇报资源使用情况 |
| ApplicationMaster (AM) | 每个应用(如 Spark job)的“管家”,向 RM 申请资源,协调任务执行 |
3 流程
通信双方有一端是 Client,另一端为 Server,且 Client 总 是主动连接 Server 的
通信模型: pull-model
- 步骤1: 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
- 步骤2: ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
- 步骤3: ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
- 步骤4: ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
- 步骤5: 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
- 步骤6: NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 步骤7: 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
- 步骤8: 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。


Avro 是 Hadoop 生态系统中的 RPC 框架,具有平台无关、支持动态 模式(无需编译)等优点
4 调度器
4.1 FIFO
4.2 CapacityScheduler
4.3 FairScheduler
5 Yarn 配置
1 | grep -A2 -B1 cg yarn-site.xml |
1 | 总核数 = 物理CPU个数 X 每颗物理CPU的核数 |
Yarn 默认统计是用的物理核来计算CPU资源的,
我们的yarn配置里面没有指定yarn.nodemanager.resource.count-logical-processors-as-cores 为 true,
1 | <property> |
例如这台机器的逻辑CPU是96核,物理cpu是2个×24核=48核,yarn配置最大使用是80物理核[捂脸]
不清楚是否有问题?
6 Yarn rest api
6.1 查询运行中的任务id:
1 | curl 'http://<host>:8080/ws/v1/cluster/apps?queue=<queue>&state=RUNNING' | jq '.apps.app[] | .id' | less |
6.2 kill掉任务
1 | curl -v -X PUT -H "Content-Type: application/json" -d '{"state": "KILLED"}' 'http://<host>:8080/ws/v1/cluster/apps/<app_id>/state' |