文件名称:【容器系统】之大数据容器化-基于Kubernetes构建现代大数据系统.pdf
文件大小:175KB
文件格式:PDF
更新时间:2022-12-24 11:22:01
文档资料
【容器系统】之⼤数据容器化-基于Kubernetes构建现代⼤数据系统 Apache Spark 在⼤数据处理与分析领域,Apache Spark⽆疑占据着重要地位。它的特点是基于内存计算,⽀持各类资源管理平台,其中以YARN最为常 见,同时⼜与Hadoop平台集成,在集群节点以HDFS作为分布式⽂件存储系统。 我们可以先看⼀下搭建⼀个常见的Apache Spark⼤数据平台需要哪些步骤: 1.安装Hadoop集群 2.配置HDFS 3.配置YARN 4.安装Spark 5.配置Spark与YARN集成 事实上如果参阅官⽅⽂档,还有更多细节检查与配置,有过⼤数据相关领域从业经验的⼈都知道,要搭建⼀套可⽤的⼤数据环境并不容易, 再加上后期维护,就更吃⼒了,⽽⼀套稳定的⼤数据平台正是进⾏⼤数据应⽤开发的基础。根据笔者了解,有不少公司正是因为⼤数据平台 搭建及配置的复杂性等原因,不得不在多个测试环境中,共⽤⼀套⼤数据平台,这种⽅式长期看维护成本较⾼,也可能存在安全隐患。 ⼤数据领域需要⼀些变化,⽽Kubernetes的出现则提供了契机。 Kubernete(以下简称k8s)是容器集群管理系统,是⼀个开源的平台,可以实现容器集群的⾃动化部署、⾃动扩缩容、维护等功能。通过 Kubernetes你可以: · 快速部署应⽤ · 快速扩展应⽤ · ⽆缝对接新的应⽤功能 · 节省资源,优化硬件资源的使⽤ ⼤数据社区 随着K8s社区的发展壮⼤,微服务及容器化被越来越多的公司应⽤到⽣产环境。与此同时,K8s也成为容器编排的⾸选平台。⼤数据社区在 容器化进程中当然也是不⽢落后的。 Spark⾃2.3开始官⽅⽀持K8sFlink⾃1.9开始官⽅⽀持K8sHue官⽅Helm chart包Hive以MR3为执⾏引擎⽀持K8sAirflow⾃1.10开始⽀ 持K8sPresto⽀持K8s…… 可以看到整个⼤数据社区也在积极⽀持容器化,但⼤数据的容器化并不是⽣硬地将各个组件搬到K8s上,以Spark on YARN为例,核⼼组 件YARN作为资源调度器,其结构如下图所⽰ 下图讲述了Apache Spark on YARN的⼯作⽅式: YARN ResourceManager的功能为: 负责集群中所有资源的统⼀管理和分配,它接收来⾃各个节点(NodeManager)的资源汇报信息,并把这些信息按照⼀定的策略分配给各 个应⽤程序 了解K8s的同学可以看出YARN的功能其实与K8s Scheduler的功能⾮常类似 Kubernetes 调度器是⼀个策略丰富、拓扑感知、⼯作负载特定的功能,调度器显著影响可⽤性、性能和容量。调度器需要考虑个⼈和集体 的资源要求、服务质量要求、硬件/软件/政策约束、亲和⼒和反亲和⼒规范、数据局部性、负载间⼲扰、完成期限等。 所以与其将YARN⽣搬到K8s中(早期确实是这样做的),何不⽤K8s调度器替换掉YARN,使得Spark适应K8s呢? 事实上社区确实是在 这个⽅向努⼒尝试,并且⾃Spark 2.3开始,实验性⽀持使⽤K8s原⽣Scheduler替代YARN。 spark on k8s: 在该⽅案中 1.客户端通过 spark-submit 将任务提交到K8s集群中,并在集群中启动⼀个Spark Driver Pod; 2.Spark Driver启动相应的Executor Pod, 组成⼀个Spark Application集群并执⾏作业任务; 3.任务执⾏完成后,Executor Pod会被销毁, ⽽Driver Pod会持久化相关⽇志,并保持在'completed'状态,直到⽤户⼿清理或被K8s集群的 垃圾回收机制回收. Spark原⽣⽀持K8s的好处也是很明显的:可以更好的利⽤K8s的集群资源,通过K8s赋能,更好的进⾏资源的隔离。这个⽅案不太友好的 地⽅在于: spark-submit 在K8s集群之外,使⽤⾮声明式的提交接⼝,实际使⽤起来不够友好。 将Spark应⽤迁移到K8s环境中 Spark Operator是Google基于Operator模式开发的⼀款的⼯具, ⽤于通过声明式的⽅式向K8s集群提交Spark作业,并且负责管理Spark 任务在K8s中的整个⽣命周期,其⼯作模式如下 我们可通过Hem安装 spark-operator $ helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator $ helm install incubator/sparkoperator --namespace spark-operator 创建服务⽤户及绑定权限 $ kubectl create serviceaccount