导读:
近些年随着云计算和云原生利用的衰亡,容器技术能够很好地解决许多问题,所以将大数据平台容器化是一种现实的计划。本文将联合袋鼠云数栈在Flink on Kubernetes的实际让您对大数据平台容器化的操作和价值有初步的理解。
你能够看到
▫ Kubernetes如何解决Hadoop痛点
▫ 数栈在Flink on K8S的实际
▫ 容器化之后的将来构想:资源池化
作者 / 雅泽、狗焕
编辑 / 向山
引言
在过来的很长一段时间,大数据畛域中构建可扩大的分布式应用框架中,Apache Hadoop占据的是相对的统治位置。
目前绝大多数大数据平台都是基于Hadoop生态构建,应用YARN作为外围组件进行资源管理与资源调度,然而这些大数据平台广泛都会存在资源隔离性差、资源利用率低等问题,与此同时近些年随着云计算和云原生利用的衰亡,容器技术能够很好地解决这些问题。
所以将大数据平台容器化是一种现实的计划,本文将联合袋鼠云数栈在Flink on Kubernetes的实际让您对大数据平台容器化的操作和价值有初步的理解。
Hadoop痛点频现,亟待解决
大数据平台顾名思义就是解决急速增长的实时、离线数据的大规模应用程序,所以设计大数据平台的解决方案的须要思考的首要问题就是如何确定生产环境中大数据平台的部署架构,使得平台具备紧密联系数据、应用程序与基础设施之间的能力。
Hadoop次要提供了三个要害性能:资源管理器(YARN)、数据存储层(HDFS)、计算范式(MapReduce),市面上大多数大数据平台都是基于Hadoop生态构建的,然而这类型的平台会存在下列问题:
资源弹性有余
大数据系统的资源应用顶峰是具备周期性的,不同业务线在一天中的高峰期是不一样的,当业务压力增大时,以后的大数据系统广泛不足资源弹性伸缩的能力,无奈按需进行疾速扩容,为了应答业务顶峰只能预留出足够的资源保障工作失常运行;
资源利用率低
存储密集型的业务存储资源应用较高而CPU使用率长期处于较低的程度,计算密集型的业务尽管CPU使用率绝对较高然而存储的使用率非常低,大量资源闲置;
资源隔离性差
从Hadoop2.2.0开始,YARN开始应用cgroup实现了CPU资源隔离,通过JVM提供的内存隔离机制来实现内存资源隔离,整体上来看YARN的资源隔离做的并不欠缺,会造成多个工作运行到同一个工作节点上时,不同工作会呈现资源抢占的状况。
Kubernetes风头正劲,完满解决Hadoop痛点
Kubernetes是谷歌开源的生产级的容器编排零碎,是建设在谷歌大规模运行生产工作负载方面的十几年的教训根底上的,而且领有一个宏大且快速增长的生态系统,随同着微服务、DevOps、继续交付等概念的衰亡和继续发酵,并依靠与云原生计算基金会(CNCF),Kubernetes放弃着高速倒退。
如下图所示,Google过来五年对于Kubernetes和Apache Hadoop热度统计后果展现表明市面上对Kubernetes的激情逐步低落而对Hadoop热度逐步减退。
那么,Kubernetes是如何解决Hadoop存在的痛点的呢,咱们一一剖析一下。
解决资源弹性有余
对于资源弹性有余的问题,Kubernetes自身就是设计为一个利用模块化架构来进行扩大的零碎,对用户来说,服务进行扩容只须要批改配置文件中容器的正本数或者是应用Pod程度主动扩缩(HPA),将利用扩缩容的复杂度交给Kubernetes管制能够极大缩小人为染指的老本。HPA是基于CPU使用率、内存使用率或其余实时采集的性能指标主动扩缩ReplicationController、Deployment和ReplicaSet中的Pod数量。
Kubernetes中的Metrics Server会继续采集所有Pod正本的性能指标信息,HPA控制器通过Metrics Server的API获取这些数据,并依据用户设置的主动扩缩容规定计算指标Pod正本数量,当指标Pod数量与以后Pod数量不统一时,HPA控制器就向Pod的正本控制器发动扩缩容操作,调整Pod数量,实现扩缩容操作。
解决资源使用率低
对于资源使用率低的问题,一方面Kubernetes反对更加细粒度的资源划分,这样能够尽量做到资源能用尽用,最大限度的按需应用。另外一方面反对更加灵便的调度,并依据业务SLA的不同,业务顶峰的不同,通过资源的混合部署来进一步晋升资源使用率。
解决资源隔离性差
对于资源隔离性差的问题,容器技术自身是具备资源隔离的能力的,底层应用Linux namespace进行资源隔离,它将全局零碎的资源包裹在一个形象层中,使得在每个 namespace 外部的过程看起来本人都领有一个独立的全局资源。
同一个 namespace 下的资源变动对于同一 namespace 的过程是可见的,然而对于不同namespace下的过程是不可见的。为了可能让容器不占用其它容器的资源(或者说确定每个容器的“硬件”配置),采纳cgroups来限度单个过程或者多个过程所应用资源的机制,能够对 cpu,内存等资源实现精细化的管制。
Flink on K8S实际,数栈钻研小成
正因为大数据组件容器化劣势显著,数栈应用的大数据计算和存储组件均预期往容器化方向排布。
在数栈目前应用的泛滥组件中,咱们首先抉择在k8s上尝试实际的是数栈流计算引擎——Flink 。通过钻研布设,当初数栈的流计算容器化转换曾经根本实现。接下来是一些Flink on K8S的教训分享:
Flink on K8S概述
目前在K8S中执行Flink工作的形式有两种,一种是Standalone,一种是原生模式:Flink native session 模式、Flink native per-job 模式,它们各自对应的优缺点如下:
Flink Standalone模式:
● 长处:长处是无需批改 Flink 源码,仅仅只需事后定义一些 yaml 文件,集群就能够启动,相互之间的通信齐全不通过 K8s Master;
● 毛病:毛病是资源须要事后申请无奈动静调整。
Flink native session 模式:
● 长处:taskManager 的资源是实时的、按需进行的创立,对资源的利用率更高,所需资源更精准。
● 毛病:taskManager 是实时创立的,用户的作业真正运行前, 与 Per Job集群一样, 仍须要先期待 taskManager 的创立, 因而对工作启动工夫比拟敏感的用户,须要进行肯定的衡量。
Flink native per-job 模式:
● 长处:资源按需申请,适宜一次性工作,工作执行后立刻开释资源,保障了资源的利用率;
● 毛病:资源是在工作提交后开始创立,同样意味着对于提交工作后对延时比拟敏感的场景,须要肯定的衡量;
数栈Flink Standalone on K8S实际
接下来咱们以standalone模式容器化为切入点介绍下咱们的一些实际。
咱们通过自定义的资源对象来定义咱们利用的相干部署属性,而后将这个yaml文件和所需的配置文件以及镜像打包上传到easymanager平台(后续会将其开源)进行一键部署。这里对于利用整体状态的解决大抵如下:
● 对于配置:这里咱们把利用的波及到的状态数据都提炼到利用的配置变成k8s中的configmap,通过该配置作为对立的批改入口。同时拆散出jobmanager和taskmanager的配置使两者对各自状态进行保护互不烦扰。
● 对于存储:拆散存储状态,可采纳pvc来申明咱们所须要的存储类型(storageclass),或者咱们能够在镜像中内置一个hdfs的client或者s3插件来间接对接客户现场的环境,这里咱们是将hdfs client和s3的插件包封装到了flink的镜像中,而后通过下面提取出的配置来进行管制对应的存储对接。
● 对于集群状态信息:咱们在部署flink的时候咱们会部署好根底组件包,如zookeeper、redis、mysql等,同样也能通过下面提取的配置参数进行批改对接内部根底组件。
实际如下:
1) 定义咱们自定义资源形容:
flink社区领有大量的插件供咱们应用,通过这些插件咱们能扩大一些须要的能力,然而将这些插件都打包到镜像中,那么这个镜像体积势必会变得十分大,这里咱们将这些插件独自抽离进去做成一个独自的根底服务组件,而后通过咱们的业务镜像去援用这些根底组件,在援用这些根底组件后会以sidecar模式注入到咱们的业务容器中实现目录绑定,从而实现按需索取也减小了镜像体积的大小。
下面对应资源形容了在k8s上利用最根本的部署能力,这里咱们还须要将公共配置进行映射,而后将这些配置裸露到前端。通过这个对立的配置批改入口简化了交付人员对配置文件的筛查和批改。
2) 自动化出包:
咱们在定义好资源对象的形容后,依据定义的资源形容文件将须要的配置提取以及编写利用须要的相干属性,将这些内容放到一个yaml文件中,同时编写dockerfile、启动脚本、编写jenkinsfile接入自动化出包流程,最初出包验证。通过分工合作这样一来就能将外部原先大量人工的操作全副主动流程化,提高效率。
3) 部署:
实现部署后的后果如下:
通过点击“服务扩缩容”,咱们能够一键扩缩taskmanager的计算资源:
而后咱们能够通过k8s的ingress资源对象裸露的地址来拜访flink的ui进行后续flink集群的运维操作。
通过以上flink standalone容器化咱们简化了主机模式下flink的部署、资源管理划分等问题。那么对于利用日志收集和监控,咱们采纳的是loki和prometheus的动静服务发现。
容器之后,数栈走向何方
只管Kubernetes可能解决传统Hadoop生态存在的一些痛点问题,然而间隔它能真正成为一个部署大数据利用切实可行的平台还是有很长的一段路要走的:比方为短生命周期与无状态利用设计的容器技术、不同job之间短少共享的长久化存储以及大数据平台关怀的调度、平安以及网络相干问题还须要更好的解决方案。当初,数栈正积极参与开源社区,帮忙 Kubernetes 能成为部署大数据应用程序的实用抉择。
对于数栈而言,基于存算拆散的设计理念,应用Kubernetes解决了计算资源弹性扩大的问题后,因为计算资源与存储资源的拆散,可能会呈现计算性能升高、存储的弹性无奈保障等问题。将来咱们会思考在存储层应用对象存储,整体架构在计算和底层存储之间加上一层缓存(比方JuiceFS和Alluxio),存储层选型在OpenStack Swift、Ceph、MinIO等成熟的开源计划中。
容器之后,咱们并未停下脚步,对于将来咱们有很多在思考的构想,比方利用云化或者云原生技术对立治理资源池,实现大数零碎产品、计算、存储资源池化,实现全局化、集约化的调度资源等等,技术在迭代,咱们的自我变革也从未进行。
开源我的项目技术交换
ChunJun
https://github.com/DTStack/ch...
https://gitee.com/dtstack_dev...
Taier
https://github.com/DTStack/Taier
https://gitee.com/dtstack_dev...
MoleCule
https://github.com/DTStack/mo...
https://gitee.com/dtstack_dev...
欢送退出开源框架技术交换群
(钉钉群:30537511)