Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix 1.4 doc not updated #162

Merged
merged 1 commit into from
Jan 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
---
sidebar_position: 4
---

# 使用Koordiantor将Hadoop YARN与K8s混部

## 背景介绍
Koordinator已经支持了K8s生态内的在离线混部,通过Batch超卖资源以及BE QoS,离线任务可以使用到集群内的空闲资源,提升资源使用效率。然而,
在K8s生态外,仍有相当数量的用户会选择将大数据任务运行其他资源管理系统,例如[Apache Hadoop YARN](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html)。
作为大数据生态下的资源管理系统,YARN承载了包括MapReduce、Spark、Flink以及Presto等在内的多种计算引擎。

为了进一步丰富Koordinator支持的在离线混部场景,Koordinator社区提供了面向大数据生态下的混部套件`Koordinator YARN Copilot`,
支持将超卖的Batch资源提供给Hadoop YARN使用,进一步提升集群资源的使用效率。`Koordinator YARN Copilot`具备以下特点:

- 面向开源生态:基于Hadoop YARN开源版本,不涉及对YARN的侵入式改造。
- 统一资源优先级和QoS策略:YARN任务同样使用Koordinator的Batch优先级资源,同时会受koordlet一系列QoS策略的管理。
- 节点级别的资源共享:Koordinator提供的混部资源,既可被K8s Pod使用,也可被YARN task使用,不同类型的离线应用可在同一节点内共存。
- 适配多种环境:对运行环境没有严格要求,可以在公有云或者IDC内使用。

## 使用限制
| 组件 | 版本要求 |
| --- | ------- |
| Kubernetes | ≥v1.18 |
| Koordinator | ≥v1.4 |
| Koordinator YARN Copilot | ≥v0.1 |
| Hadoop YARN | ≥v3.2.1 |

## 组件安装
Koordinator相关对组件都可以通过 helm v3.5+ 安装,Helm 是一个简单的命令行工具,您可以从 [这里](https://github.com/helm/helm/releases) 获取它。

![image](/img/hadoop-k8s.svg)

### 安装Koordinator
请确保Koordinator已正确安装在你的集群中。您可请参考[安装文档](https://koordinator.sh/docs/installation)获取有关安装和升级的详细信息。
```shell script
# Firstly add koordinator charts repository if you haven't do this.
$ helm repo add koordinator-sh https://koordinator-sh.github.io/charts/

# [Optional]
$ helm repo update

# Install the latest version.
$ helm install koordinator koordinator-sh/koordinator
```

### 安装Hadoop YARN
Hadoop YARN包括ResourceManager和NodeManager两部分组件,若您目前已经有可用的YARN集群,Koordinator社区建议的方式是保持ResourceManager
以宿主机进程的方式直接部署不变,将NodeManager以K8s Pod的形式部署,后续随Koordinator YARN Copilot的迭代演进再将ResourceManager进行容器化改造。

Koordinator社区在Helm仓库中提供了`hadoop-yarn`样例组件,其中包括ResourceManager和NodeManager,以及可供选择性安装的HDFS相关组件,
以便轻松运行示例作业。您可以直接安装样例组件以便快速尝试YARN与K8s混部,或者参考官方[安装指南](https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html)
搭建自己的 YARN 集群。

```shell script
# Firstly add koordinator charts repository if you haven't do this.
$ helm repo add koordinator-sh https://koordinator-sh.github.io/charts/

# [Optional]
$ helm repo update
# Install the latest version.
$ helm install hadoop-yarn koordinator-sh/hadoop-yarn

# check hadoop yarn pods running status
kubectl get pod -n hadoop-yarn
```

在搭建YARN集群之前,您应该了解以下关键信息:

- ResourceManager必须能够在K8s pod中访问,无论部署方式为host模式还是pod模式。
- NodeManager必须部署为pod模式部署,并带有annotation注释`yarn.hadoop.apache.org/node-id=${nm-hostname}:8041`,用来标识对应YARN节点的ID。
- NodeManager必须使用CgroupsLCEResourcesHandler作为YARN的容器执行器,并将cgroup层次结构指定在k8s best-effort目录下。
- NodeManager Pod使用koord-batch优先级资源,因此必须预先安装Koordinator并启用混部配置。

Koordinator提供的Helm样例中,以上相关功能已经在默认配置中开启,如果您使用的是自行维护的YARN,您可以参考Koordinator Helm库中的
[样例配置](https://github.com/koordinator-sh/charts/blob/main/charts/hadoop-yarn)进行修改。

### 安装Koordinator YARN Copilot
Koordinator YARN Copilot由`yarn-opeartor`和`copilot-agent`(建设中)两部分组成。

```shell script
# Firstly add koordinator charts repository if you haven't do this.
$ helm repo add koordinator-sh https://koordinator-sh.github.io/charts/

# [Optional]
$ helm repo update

# Install the latest version.
$ helm install koordinator-yarn-copilot koordinator-sh/koordinator-yarn-copilot
```

## 配置
1. koord-manager相关配置

在通过helm chart安装Koordinator时,ConfigMap slo-controller-config将默认被创建在koordinator-system命名空间下。YARN任务的cgroup将
在K8s的best-effort目录下管理,这部分将以Host应用的形式在slo-controller-config中配置,有关Koordinator对YARN任务的资源管理,可参考
相关[issue](https://github.com/koordinator-sh/koordinator/issues/1727)获取更多细节。

使用以下ConfigMap,创建configmap.yaml文件
```yaml
apiVersion: v1
data:
colocation-config: |
{
"enable": true
}
resource-threshold-config: |
{
"clusterStrategy": {
"enable": true
}
}
resource-qos-config: |
{
"clusterStrategy": {
"lsrClass": {
"cpuQOS": {
"enable": true
}
},
"lsClass": {
"cpuQOS": {
"enable": true
}
},
"beClass": {
"cpuQOS": {
"enable": true
}
}
}
}
host-application-config: |
{
"applications": [
{
"name": "yarn-task",
"priority": "koord-batch",
"qos": "BE",
"cgroupPath": {
"base": "KubepodsBesteffort",
"relativePath": "hadoop-yarn/"
}
}
]
}
kind: ConfigMap
metadata:
name: slo-controller-config
namespace: koordinator-system
```

查看安装的命名空间下是否存在ConfigMap,以命名空间`koordinator-system`和ConfigMap名字`slo-controller-config`为例,具体以实际安装配置为准。

- 若存在ConfigMap `slo-controller-config`,请使用PATCH方式进行更新,避免干扰ConfigMap中其他配置项。

```bash
kubectl patch cm -n koordinator-system slo-controller-config --patch "$(cat configmap.yaml)"
```

- 若不存在ConfigMap `slo-controller-config`,请执行以下命令进行创建ConfigMap。

```bash
$ kubectl apply -f configmap.yaml
```

2. koord-yarn-copilot相关配置
`koord-yarn-copilot`在进行资源同步时会与YARN ResourceManager进行通信,相关配置在独立的ConfigMap中进行管理。

```yaml
apiVersion: v1
data:
core-site.xml: |
<configuration>
</configuration>
yarn-site.xml: |
<configuration>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>resource-manager.hadoop-yarn:8033</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>resource-manager.hadoop-yarn:8032</value>
</property>
</configuration>
kind: ConfigMap
metadata:
name: yarn-config
namespace: koordinator-system
```

您可以在Helm Chart的value配置`yarnConfiguration.resourceManager`中修改地址和端口信息。

### (可选)进阶配置
您可以参考[hadoop-yarn](https://github.com/koordinator-sh/charts/blob/main/charts/hadoop-yarn)
和[koordinator-yarn-copilot](https://github.com/koordinator-sh/charts/blob/main/charts/koordinator-yarn-copilot)
的Helm仓库,获取更多进阶配置的详细说明。

## 查看YARN集群中节点的资源信息
1. 查看K8s Node中的Batch资源总量信息。
```bash
$ kubectl get node -o yaml | grep batch-cpu
kubernetes.io/batch-cpu: "60646"
kubernetes.io/batch-cpu: "60486"

$ kubectl get node -o yaml | grep batch-memory
kubernetes.io/batch-memory: "245976973438"
kubernetes.io/batch-memory: "243254790644"
```

2。 查看YARN Node中的节点资源总量信息。
在浏览器中访问YARN ResourceManager的Web UI地址`${hadoop-yarn-rm-addr}:8088/cluster/nodes`,查看NodeManager状态和资源总量信息。

如果您使用了Koordinator Helm仓库中提供的YARN样例组件,可在本地执行以下命令,使得RM可以通过本机地址直接访问:
```shell script
$ kubectl port-forward -n hadoop-yarn service/resource-manager 8088:8088
```

打开浏览器,访问地址`http://localhost:8088/cluster/nodes`

查看各节点的资源总量信息`VCores Avail`和`Mem Avail`,可以看到其与K88s节点的Batch资源相同。

## 向YARN集群提交作业
Spark、Flink等计算引擎自诞生之初就支持向YARN提交作业运行,在使用时可参考[Spark](https://spark.apache.org/docs/latest/running-on-yarn.html)
和[Flink](https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/yarn/)官方文档获取详细步骤。

在Koordinator Helm仓库提供的YARN样例组件中我们已经集成了Spark,您可以直接执行以下命令向YARN提交作业执行,并在Resource Manager的Web界面中,查看作业的执行情况。
```shell script
$ kubectl exec -n hadoop-yarn -it ${yarn-rm-pod-name} yarn-rm -- /opt/spark/bin/spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi /opt/spark/examples/jars/spark-examples_2.12-3.3.3.jar 1000
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Koordinator YARN Copilot

## 背景介绍
Koordinator已经支持了K8s生态内的在离线混部,通过Batch超卖资源以及BE QoS,离线任务可以使用到集群内的空闲资源,提升资源使用效率。然而,
在K8s生态外,仍有相当数量的用户会选择将大数据任务运行其他资源管理系统,例如[Apache Hadoop YARN](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html) 。
作为大数据生态下的资源管理系统,YARN承载了包括MapReduce、Spark、Flink以及Presto等在内的多种计算引擎。虽然目前一些计算引擎提供了K8s operator可以
将任务融入到K8s生态,但不可否认的是,目前YARN生态依然保持一定的活跃度,典型的例子是包括阿里云在内的一系列主流云厂商仍然提供类似[E-MapReduce](https://www.aliyun.com/product/bigdata/emapreduce)
的产品,支持用户将大数据作业提交到YARN上运行,这点从产品的受欢迎程度上可见一斑。

因此,为了进一步丰富Koordinator支持的在离线混部场景,Koordinator社区会同来自阿里云、小红书、蚂蚁金服的开发者们共同启动了Hadoop YARN与K8s混部
项目,支持将超卖的Batch资源提供给Hadoop YARN使用,进一步提升集群资源的使用效率,该项目目前已经在小红书生产环境正式投入使用。

## 技术原理
### 设计原则
- 离线作业的提交入口依然为YARN保持不变。
- 基于Hadoop YARN开源版本,原则上不对YARN做侵入式改造。
- Koordinator提供的混部资源,既可被K8s Pod使用,也可被YARN task使用,不同类型的离线应用可在同一节点内共存。
- 单机QoS策略由Koordlet统一管理,并兼容YARN Task的运行时。

![image](/img/hadoop-k8s.svg)

### 资源分配与仲裁
在Koordinator中,节点超卖的Batch资源量由koord-manager根据节点资源负载情况动态计算得出,并以extended-resource形式更新在K8s的Node对象中。
对于YARN场景的适配,将由koord-yarn-operator组件负责将节点的Batch资源量同步给YARN RM。此外,由于K8s调度器和YARN调度器共享Batch账本,因此
在资源同步时需要将另一个系统中已经分配的Batch资源排除。具体过程如下:

1. koord-manager计算原始Batch总量`origin_batch_total`,并将其记录在K8s的node annotation中。
2. koord-yarn-operator从YARN RM收集YARN节点已经分配的资源量`yarn_requested`,并将其记录在K8s的node annotation中。
3. 在koord-manager更新K8s的Batch资源总量时,排除YARN已经分配的资源量:`k8s_batch_total = origin_batch_total – yarn_requested`
4. yarn-operator向YARN RM更新资源时,排除K8s已经分配的资源量:`yarn_batch_total = origin_batch_total – k8s_batch_requested`

![image](/img/koord-yarn-operator.svg)

在双调度器的工作模式下,由于资源申请量的同步存在时序先后,节点的Batch可能会被过量分配,koordlet将在单机侧对资源进行二次仲裁。不过,与kubelet仲裁
机制不同的是,koordlet将以"避免干扰在线",以及"确保离线资源质量"为目标,复用当前的QoS策略作为仲裁手段,既结合节点实际的资源使用情况,非必要不驱逐
离线任务。

### 节点运行时管理
Node Manager是YARN的节点组件,主要负责离线任务的生命周期管理,在K8s混部场景下NM将以DaemonSet形式部署。为了对资源进行更精细的管理,
YARN Task将与NM的资源管理相互独立,NM在部署时只需按自身开销申请Batch混部资源。

![image](/img/node-manager-runtime.svg)

为了能够通过cgroup来管理YARN任务的资源使用,Koordinator要求YARN NM开启[LinuxContainerExecutor](https://apache.github.io/hadoop/hadoop-yarn/hadoop-yarn-site/NodeManagerCgroups.html)
模式,并指定cgroup路径,确保可以和其他K8s Pod一样,统一在besteffort分组下管理。

![image](/img/node-manager-cgroup.svg)

### 单机QoS策略适配

koodlet目前在单机支持了一系列的QoS策略,这些同样需要针对YARN场景进行适配。对于资源隔离参数,例如Group Identity,Memory QoS,L3 Cache隔离等,
koordlet将根据设计的cgroup层级进行适配。而对于驱逐和压制这类动态策略,单机侧将新增一个yarn-copilot-agent模块,用于对接YARN场景的各类数据和操作,
包括YARN Task元信息采集、资源指标采集、Task驱逐操作等,所有QoS策略仍然保留在koordlet内,koordlet内部相关模块将以plugin形式对接yarn-copilot-agent接口。
同时,koord-yarn-copilot的接口设计将保留一定的扩展性,后续可用于对接其他资源框架。

![image](/img/yarn-copilot-agent.svg)

koordlet将在后续版本中陆续完成各类QoS策略对YARN场景的适配。

## 参与共建
支持K8s与YARN混部的相关功能目前已经在相关模块的最新版本中发布,社区目前仍在积极推进后续功能的迭代,如果您有相关需求或参与共建的意愿,
欢迎您提交[issue](https://github.com/koordinator-sh/yarn-copilot/issues),
或在[专项讨论区](https://github.com/koordinator-sh/koordinator/discussions/1297) 下方留言,例如:
```
联系人(gihub-id):, e.g. @koordinator-dev

您任职/就读/参与的公司/学校/组织名称:e.g. koordinator community

社区参与意向:e.g. 希望能够参与研发/学习大数据&云原生混部/将K8s&YARN混部功能在生产环境落地/其它。

您对"K8s&YARN混部"的期待:
```
Loading
Loading