首页 > 其他分享 >Yarn on K8S可行性调研

Yarn on K8S可行性调研

时间:2023-10-22 16:31:54浏览次数:58  
标签:nodemanager 可行性 Yarn gdc 集群 Pod K8S pod

1. 背景

一般离线Hadoop集群和在线Hadoop集群都是分开部署的,他们的计算资源互相隔离。离线集群一般0:00~08:00作业较多,集群压力大,其他时间段集群较为空闲。实时集群高峰期一般为10:00~20:00,其他时间段较为空闲。空闲时资源利用率低,是对资源的浪费,而离线/实时集群在高峰期资源紧张时,往往选择通过加机器来实现扩容,又增加成本。

传统的集群部署方式,不仅没有利用空闲下来的资源,还经常购买机器增加成本,这种方案对于将本增效时代会被逐步淘汰。

阿里在Yarn on K8S上,有较为深入的实践:https://mp.weixin.qq.com/s/kqC7EtgWiOCiisyWdGiMmQ。其基本思想是集群A在资源紧张时,在空闲的集群B上运行NodeManager Pod,该Pod中的Nodemanager向集群A的ResourceMananger进行汇报,执行集群A中的作业。

2. 方案

ResourcveManager独立部署,Nodemanager在K8s集群中以pod运行:

Untitled.png

3. 前置问题

nodemanager启动的container中,可能会随机启动多个端口,监听该端口。例如,flink on yarn的每个container都会随机监听一个端口提供服务:

Untitled 1.png

因此,使用端口映射的方式部署service会非常困难。基于hostNetwork: true配置,是pod使用主机网络,测试不部署service能否对外提供nginx服务:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      # 使用主机网络
      dnsPolicy: ClusterFirstWithHostNet
      # 使用主机网络
      # 该设置是使POD使用k8s的dns,dns配置在/etc/resolv.conf文件中
      # 如果不加,pod默认使用所在宿主主机使用的DNS,这样会导致容器
      # 内不能通过service name访问k8s集群中其他POD
      containers:
      - name: nginx
        image: nginx:1.7.9

在外网查询部署pod的机器,发现正常机器中的nginx服务,即nginx端口映射到了主机所在的端口,符合预期:

Untitled 2.png

4. 服务部署

集群规划如下。gdc-k8snode03-taylor直接启动resourcemanager,gdc-k8snode03-taylor启动nodemanager直连resourcemanager,gdc-k8snode02-taylor在pod中启动nodemanager连接reosurcemanager。构成了异构集群:

节点 角色 集群
gdc-k8snode03-taylor namenode datanode resourcemanager 固定Yarn集群
gdc-k8snode03-taylor nodemanager 固定Yarn集群
gdc-k8snode02-taylor nodemanager k8s Yarn集群

如下,对于gdc-k8snode03-taylor节点,启动了ResourceMananger和NodeManager服务:

Untitled 3.png

K8s部署Nodemanager,配置特权容器:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: debian
spec:
  replicas: 4
  selector:
    matchLabels:
      app: debian
  template:
    metadata:
      labels:
        app: debian
    spec:
      hostNetwork: true
      # 使用主机网络
      #dnsPolicy: ClusterFirstWithHostNet
      dnsPolicy: Default
      # 使用主机网络
      # 该设置是使POD使用k8s的dns,dns配置在/etc/resolv.conf文件中
      # 如果不加,pod默认使用所在宿主主机使用的DNS,这样会导致容器
      # 内不能通过service name访问k8s集群中其他POD
      containers:
      - name: debian
        image: debian
        securityContext:
            privileged: true
        command: ["/bin/bash","-c","while true; do sleep 1000; done"]

在pod中启动nodemanager:

Untitled 4.png

查看resourcemanager,发现k8s nodemanager正常展示在resourcemanager web页面中:

Untitled 5.png

5. 作业测试

执行mapreduce测试作业:

root@gdc-k8snode03-taylor:~/hadoop-3.2.1# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar pi 100 1

作业正常执行,且运行在了k8s nodemanager之中:

Untitled 6.png

6. 流程缺陷

  1. 上述过程中,没有隔离网络和文件系统。容器和主机共用ip和端口,以及文件系统,这不符合上线标准。后续应该每个pod对外以独立的ip和端口进行通信。
  2. 上述流程pod直接使用本机的文件系统中的hadoop环境启动k8s nodemanager,后续可以将hadoop环境打成镜像启动pod。

7. 方案缺陷及改进展望

上面实现了最基本的Yarn On K8S方案,但是有以下缺陷:

  1. 需要挂盘。每个NM Pod需要挂载固定盘到机器中,以暂存Shuffle Write数据。对于大作业,可能每个NM Pod要挂载十几个盘,成本高,操作复杂。
  2. NM资源固定。默认情况下,启动NM时会指定NM的资源,但是当启动Pod的机器正在运行大的实时作业时,可能存在和NodeManager Pod争抢资源的情况,导致实时作业延迟。我们不希望NodeManager Pod影响所在节点正常运行的作业。
  3. 规则固定。启动Pod和停止Pod的时间是固定的,无法灵活使用集群资源。
  4. 挂载资源盘,配置NM资源,都会造成较高的人工运维成本。

展望:

  1. NodeManager资源弹性伸缩:通过Kube-ApiServer的List&Watch机制,获取节点可用资源,汇报给RM,从而实现NodeManager的动态扩缩容以及资源超发。
  2. 驱逐策略:通过收集每个Container的Metrics,对内存大、CPU占用高的container进行驱逐。尽量不驱逐AM,只驱逐普通container进程。
  3. 固定盘优化:基于RSS提供存算分离,将原本写入本地盘的Shuffle Write写入RSS,这样就无需挂载本地盘了。
  4. Pod弹性伸缩:收集Yarn集群和K8S集群的指标,如果Yarn集群资源较为紧张,而K8S集群资源空闲,则在K8s启动Pod对Yarn进行扩容。

标签:nodemanager,可行性,Yarn,gdc,集群,Pod,K8S,pod
From: https://blog.51cto.com/u_15327484/7977672

相关文章

  • k8s-pod版本更新
    pod版本更新⭐️⭐️在实际应用中,升级是一个常见的场景,Deployment能够很方便的支撑应用升级。Deployment可以设置不同的升级策略,有如下两种。RollingUpdate:滚动升级,即逐步创建新Pod再删除旧Pod,为默认策略。Recreate:替换升级,即先把当前Pod删掉再重新创建Pod。Deployment的升级可......
  • Yarn federation原理与实践
    1.背景随着业务的增长,Yarn集群也不断扩展。节点数增多、请求增多、队列增多,造成调度性能线性下降。如下是三个集群的性能数据:集群队列数量平均调度耗时最大每秒调度数量CPS集群A27063.8ms483集群B620940微秒1150集群C399676微秒1013对于集群A,......
  • K8S使用开源CEPH作为后端StorageClass
    1引言K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。https://docs.ceph.com/en/reef/rbd/rbd-kuber......
  • 205-303 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.17-3.3
    一、水平自动扩容和缩容HPA(K8S版本>=1.23.x)HPA全称HorizontalPodAutoscaler,Pod水平自动伸缩,HPA可以基于CPU利用率replicationcontroller、deployment和replicaset中的pod数量进行自动扩缩容。pod自动缩放对象适用于无法缩放的对象,比如DaemonSetHPA由KubernetesAPI资源和控......
  • Yarn SLS代码分析及实践
    1.背景在https://blog.51cto.com/u_15327484/7894282文章中,介绍了Yarn的两种调度器。在https://blog.51cto.com/u_15327484/7920197文章中,介绍了FairScheduler迁移CapacityScheduler的迁移实践。在实际迁移之前,必须要确保CapacityScheduler能够达到足够的收益,即吞吐率或调度时......
  • k8s中服务器重启后,provisioner制备区异常
    kubectllogs-fopenebs-localpv-provisioner-77886fbccd-fbv8k-nopenebsF101906:43:35.9089841provisioner.go:247]Errorgettingserverversion:Get"https://10.96.0.1:443/version?timeout=32s":dialtcp10.96.0.1:443:i/otimeout......
  • 使用 kaniko 在 K8S 中构建镜像
    背景现有个需求需要在K8S中构建一个新的镜像,之前使用docker命令进行构建,后面K8S升级,容器运行时换成了containerd,故查了一下网络,发现kaniko比较好用。所以测试记录一下~项目地址:https://github.com/GoogleContainerTools/kaniko测试例子一:mkdir-p/data/yaml/default......
  • kubeadm安装k8s集群
    kubeadm安装k8s集群一、机器准备(所有的master和node节点需要执行)部署k8s集群的节点按照用途可以划分为如下2类角色:master:集群的master节点,集群的初始化节点,基础配置不低于2c4gslave:集群的slave节点,可以多台,基础配置不低于1c2g主机名、节点ip、部署组件k8s-master10.......
  • k8s pv与pvc
    k8spv与pvc概念PV我们想要持久化k8spod中的数据,就需要用到存储,找一个地方,存放数据。不然一旦pod被删除,则数据就丢失了。在k8s中,pv就是存储数据的地方,可以理解为pv就是存储后端。pv可以由多种存储系统提供,如NFS,GFS,本地,CIFS,云存储集群等PVC用户想要使用PV,就需要申请,说明要......
  • 204 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.12-2.16
    一、API资源对象Job一次性运行后就退出的Pod1.1使用kubect生成YAML文件#kubectlcreatejobjob01--image=busybox--dry-run=client-oyaml>job01.yaml#vimjob01.yaml#catjob01.yamlapiVersion:batch/v1kind:Jobmetadata:creationTimestamp:nullnam......