使用Koordiantor将Hadoop YARN与K8s混部

背景介绍

Koordinator已经支持了K8s生态内的在离线混部,通过Batch超卖资源以及BE QoS,离线任务可以使用到集群内的空闲资源,提升资源使用效率。然而, 在K8s生态外,仍有相当数量的用户会选择将大数据任务运行其他资源管理系统,例如Apache Hadoop YARN。 作为大数据生态下的资源管理系统,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 是一个简单的命令行工具,您可以从 这里 获取它。

image

安装Koordinator

请确保Koordinator已正确安装在你的集群中。您可请参考安装文档获取有关安装和升级的详细信息。

  1. # Firstly add koordinator charts repository if you haven't do this.
  2. $ helm repo add koordinator-sh https://koordinator-sh.github.io/charts/
  3. # [Optional]
  4. $ helm repo update
  5. # Install the latest version.
  6. $ 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混部,或者参考官方安装指南 搭建自己的 YARN 集群。

  1. # Firstly add koordinator charts repository if you haven't do this.
  2. $ helm repo add koordinator-sh https://koordinator-sh.github.io/charts/
  3. # [Optional]
  4. $ helm repo update
  5. # Install the latest version.
  6. $ helm install hadoop-yarn koordinator-sh/hadoop-yarn
  7. # check hadoop yarn pods running status
  8. 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库中的 样例配置进行修改。

安装Koordinator YARN Copilot

Koordinator YARN Copilot由yarn-opeartorcopilot-agent(建设中)两部分组成。

  1. # Firstly add koordinator charts repository if you haven't do this.
  2. $ helm repo add koordinator-sh https://koordinator-sh.github.io/charts/
  3. # [Optional]
  4. $ helm repo update
  5. # Install the latest version.
  6. $ 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获取更多细节。

使用以下ConfigMap,创建configmap.yaml文件

  1. apiVersion: v1
  2. data:
  3. colocation-config: |
  4. {
  5. "enable": true
  6. }
  7. resource-threshold-config: |
  8. {
  9. "clusterStrategy": {
  10. "enable": true
  11. }
  12. }
  13. resource-qos-config: |
  14. {
  15. "clusterStrategy": {
  16. "lsrClass": {
  17. "cpuQOS": {
  18. "enable": true
  19. }
  20. },
  21. "lsClass": {
  22. "cpuQOS": {
  23. "enable": true
  24. }
  25. },
  26. "beClass": {
  27. "cpuQOS": {
  28. "enable": true
  29. }
  30. }
  31. }
  32. }
  33. host-application-config: |
  34. {
  35. "applications": [
  36. {
  37. "name": "yarn-task",
  38. "priority": "koord-batch",
  39. "qos": "BE",
  40. "cgroupPath": {
  41. "base": "KubepodsBesteffort",
  42. "relativePath": "hadoop-yarn/"
  43. }
  44. }
  45. ]
  46. }
  47. kind: ConfigMap
  48. metadata:
  49. name: slo-controller-config
  50. namespace: koordinator-system

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

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

    1. kubectl patch cm -n koordinator-system slo-controller-config --patch "$(cat configmap.yaml)"
  • 若不存在ConfigMap slo-controller-config,请执行以下命令进行创建ConfigMap。

  1. $ kubectl apply -f configmap.yaml
  1. koord-yarn-copilot相关配置 koord-yarn-copilot在进行资源同步时会与YARN ResourceManager进行通信,相关配置在独立的ConfigMap中进行管理。
  1. apiVersion: v1
  2. data:
  3. core-site.xml: |
  4. <configuration>
  5. </configuration>
  6. yarn-site.xml: |
  7. <configuration>
  8. <property>
  9. <name>yarn.resourcemanager.admin.address</name>
  10. <value>resource-manager.hadoop-yarn:8033</value>
  11. </property>
  12. <property>
  13. <name>yarn.resourcemanager.address</name>
  14. <value>resource-manager.hadoop-yarn:8032</value>
  15. </property>
  16. </configuration>
  17. kind: ConfigMap
  18. metadata:
  19. name: yarn-config
  20. namespace: koordinator-system

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

(可选)进阶配置

您可以参考hadoop-yarnkoordinator-yarn-copilot 的Helm仓库,获取更多进阶配置的详细说明。

查看YARN集群中节点的资源信息

  1. 查看K8s Node中的Batch资源总量信息。
  1. $ kubectl get node -o yaml | grep batch-cpu
  2. kubernetes.io/batch-cpu: "60646"
  3. kubernetes.io/batch-cpu: "60486"
  4. $ kubectl get node -o yaml | grep batch-memory
  5. kubernetes.io/batch-memory: "245976973438"
  6. kubernetes.io/batch-memory: "243254790644"

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

如果您使用了Koordinator Helm仓库中提供的YARN样例组件,可在本地执行以下命令,使得RM可以通过本机地址直接访问:

  1. $ kubectl port-forward -n hadoop-yarn service/resource-manager 8088:8088

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

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

向YARN集群提交作业

Spark、Flink等计算引擎自诞生之初就支持向YARN提交作业运行,在使用时可参考SparkFlink官方文档获取详细步骤。

在Koordinator Helm仓库提供的YARN样例组件中我们已经集成了Spark,您可以直接执行以下命令向YARN提交作业执行,并在Resource Manager的Web界面中,查看作业的执行情况。

  1. $ 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