Spark Operator 部署及入门示例
关于存算分离
目前企业级的大数据应用主流还是采用Yarn或者Mesos来进行资源分配和运行调度的,例如我行目前采用Yarn来进行作业调度,并使用HDFS作为大数据的存储平台,这是典型的计算和存储紧耦合的模式,这种方案是通过数据本地化策略来减少数据的网络传输,从而实现良好的计算性能。
随着业务的发展,支持作业运行所需要的计算资源(CPU、内存、网络带宽)的需求量也会不断增长,就可能出现Hadoop集群的计算资源不足的情况,在目前的架构下我们只能通过扩容集群服务器的方式来解决,然而这种方式的步骤较为繁琐,且无法实现计算资源的弹性伸缩,时效性和灵活性较差 。而Spark作业通过Kubernetes进行资源管理和调度的方案可以方便地实现计算资源的动态调整,从而快速适应业务场景的变化,并且还可以实现硬件资源的充分利用并节约成本。
存算分离:将计算模块改为运行在K8S集群中来实现计算资源的快速调整;而存储模块由于状态复杂,并且不需要进行快速的资源调整和变化,因此可以将计算模块与存款模块分离开来,即近期讨论较多的存算分离的模式。
Spark Operator
Spark是目前在我行使用范围非常广泛的一种大数据计算引擎,本文将主要讨论Spark on K8S的实现。
将Spark运行在K8S集群上可以采用Spark官方原生的作业运行方式(https://spark.apache.org/docs/3.0.0/running-on-kubernetes.html),在该模式下提交Spark作业仍然延用了spark-submit命令,并且通过指定K8S集群的ApiServer地址作为master来提交Spark作业,该方式目前对于Spark作业的管理功能较为简单,并且缺乏统一的资源调度和管理能力。
我们也可以采用Spark Operator的方式,Spark Operator( https://github.com/GoogleCloudPlatform/spark-on-k8s-operator )是由谷歌发起和维护的开源项目,它将Spark和Kubernetes进行了深度的集成,是一个可以管理Spark应用程序生命周期的Kubernetes插件。开发人员通过编写yaml文件即可在K8S集群上提交Spark作业,而不需要在客户机上配置spark-submit工具。
Spark Operator还提供了强大的作业管理功能,例如使用sparkctl命令来执行创建、查看、停止作业来管理Spark作业的生命周期,还支持通过ingress的服务暴露模式来访问作业的UI界面。本文中将主要介绍Spark Operator这种作业运行模式。
Operator是由CoreOS公司推出的, 通过定义CRD(CustomResourceDefinition)和实现相应的Controller来扩展Kubernetes 集群的功能。CRD是从Kubernetes 1.7 版本开始引入的概念,它可以注册到 kubernetes 集群中,使得用户可以像使用原生的集群资源(例如 pod、deployment)一样对CRD对象进行创建、查看、删除等操作;Controller则会监听资源的状态变化并进行处理,尝试让CRD 定义的资源达到预期的状态。
接下来我们来看一下SparkOperator的相关实现原理。
Spark Operator架构
打开腾讯新闻,查看更多图片 >
Spark Operator的主要组件如下:
1、SparkApplication Controller : 用于监控并相应SparkApplication的相关对象的创建、更新和删除事件;
2、Submission Runner:用于接收Controller的提交指令,并通过spark-submit 来提交Spark作业到K8S集群并创建Driver Pod,driver正常运行之后将启动Executor Pod;
3、Spark Pod Monitor:实时监控Spark作业相关Pod(Driver、Executor)的运行状态,并将这些状态信息同步到Controller ;
4、Mutating Admission Webhook:可选模块,但是在Spark Operator中基本上所有的有关Spark pod在Kubernetes上的定制化功能都需要使用到该模块,因此建议将enableWebhook这个选项设置为true。
5、sparkctl:基于Spark Operator的情况下可以不再使用kubectl来管理Spark作业了,而是采用Spark Operator专用的作业管理工具sparkctl,该工具功能较kubectl功能更为强大、方便易用。
其中,Controller是作为Spark Operator的核心组件,用于控制和处理pod以及应用运行的状态变化。
如下代码片段展示了Controller更新Driver和Executor Pod状态变化的逻辑:
Spark 应用的状态机图示如下:
如下代码片段展示了Controller更新application应用状态的相关操作:
Spark Operator通过启动一个监听对象ResourceUsageWatcher来实时监听和更新集群资源的使用情况:
当发生新增应用的调度请求、应用状态更新,以及新增Pod或者Pod状态更新等情况下,均可触发ResourceUsageWatcher的相关操作。例如在onPodUpdated方法中,通过调用ResourceUsageWatcher的setResources来实时更新集群当前的可调度资源:
搭建运行环境
接下来我们通过一个实验来测试一下Spark Operator的相关特性。
1.本实验环境所采用的K8S集群为1.15.12 版本,Spark 采用3.0.0版本。
2.Hadoop集群采用的是CDH 5.13版本,Hadoop的版本为2.6.0。
3.下载并编译Spark Operator :
在sparkctl目录下执行编译得到sparkctl工具,并将sparkctl 拷贝到/usr/bin目录下,即可使用sparkctl命令行工具。
4.为Spark Operator插件创建namespace:
5.通过helm安装Spark Operator :
6.创建Spark作业的ServiceAccount相关权限对象
在本实验中ServiceAccount资源的创建使用的是官网上的示例yaml文件,其中ServiceAccount设置为spark,实际工作中我们也可以定义自己的ServiceAccount、Role和RoleBinding资源,并在作业提交时指定相应的对象名称即可。
一个操作HDFS文件的wordcount实例
编写示例代码
本项目中的代码是一个简单的Spark wordcount程序,通过读取存储在HDFS上的文本文件,并利用Spark计算出在该文本中每个单词的出现频率。同时采用Kerberos的认证方式来实现对HDFS的安全访问。
本示例中所采用的分布式文件系统是HDFS,后续我们也将考虑使用对象存储平台来做测试。
主要代码如下:
生成docker镜像
1.代码编写完成后,通过maven工具对本项目进行编译和打包,得到该项目的jar包:WordCount1-1.0-SNAPSHOT.jar
2.然后编写Dockerfile并生成docker镜像:
Dockerfile文件内容如下:
生成docker镜像:
将作业运行于K8S集群
打包好应用镜像之后,编写words.yaml文件,用于提交作业到K8S集群:
然后我们将在K8S集群中运行该示例程序:
提交作业
通过执行sparkctl create $.yaml 来提交作业:
查看Spark作业的运行状态
作业提交后,通过执行 sparkctl list 命令可以查看所有已提交的Spark 作业,并可以查看作业当前的运行状态:
查看应用日志
通过执行sparkctl log $ 命令即可输出该作业的详细日志信息:
后续我们考虑通过filebeat将pod的日志信息收集到ELK日志平台,从而为用户提供更为方便的日志查询渠道。
查看Spark作业的事件
通过执行sparkctl event $ 命令查看该Spark作业的event信息;
另外,在作业启动失败的情况下也可以通过该命令来分析失败原因:
查看作业运行界面
每个Spark作业的UI服务都通过ingress的暴露方式对外发布,通过执行 kubectl get ingress 命令即可获取相应作业的ingress地址:
得到ingress地址后,即可通过浏览器查看该作业的运行情况,下图展示的就是wordcount的Spark原生运行界面:
注意:没有DNS的同学可以在hosts中添加相应的域名映射即可访问。
至此我们了解了Spark on K8S的相关原理,并从0开始搭建环境并实践了一个的基于Spark Operator的应用。
目前Spark Operator这个项目还在不断地更新迭代,我们将持续关注该项目的进展,并继续在用户授权、资源隔离、日志接入和作业监控等方面进行进一步地测试和验证,逐渐探索出适合我行的Spark on K8S方案。
作者简介:
焦媛,2011年加入民生银行,目前主要负责Hadoop平台运维和相关工具研发,以及HDFS和Spark相关产品的技术支持工作。
原文链接:Spark Operator 初体验|spark|kubernetes|docker (qq.com)
Spark Operator 部署及入门示例相关推荐
- Spark on k8s Operator 部署安装
Spark on k8s Operator 部署安装 1. 背景 受限于公司内网环境,无法构建梯子及部分网络策略,不能使用网络资源直接部署,需要手动编译安装 2. 环境准备 centos 7 Kube ...
- flink1.12.0学习笔记第1篇-部署与入门
flink1.12.0学习笔记第 1 篇-部署与入门 flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇-高级 ...
- 24.大数据学习之旅——spark手把手带你入门
Spark介绍 Apache Spark™ is a fast and general engine for large-scale data processing. Spark Introduce ...
- Apache Spark处理大数据入门,看这一篇就够了
作者 Srini Penchikala ,译者 丛一 什么是Spark Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab ...
- kettle 笛卡尔_Kettle-Spoon入门示例
Spoon 是Kettle的设计调试工具 1. 微软ETL与Java 开源Kettle做下对比 微软Integration Services 项目 测试(仅2008版做比较,更高版 ...
- [WCF编程]1.WCF入门示例
一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...
- Spring MVC 入门示例讲解
在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...
- Restlet入门示例
http://cunfu.iteye.com/blog/757467 本文的目的在于完成一个Restlet入门示例. 首先,是一个Stand alone应用. 然后,将其部署与Tomcat容器中. 最 ...
- JVM插桩之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
最新文章
- 关于PCA算法的一点学习总结
- 使用深度学习和OpenCV的早期火灾检测系统
- pandas之loc iloc ix
- 【解决】insert 语句无效果,在查询中正常运行问题
- sql常识- UNIQUE
- 怪兽充电启动招股:2020年业绩下滑五成,小米、高瓴参与认购
- oracle PL/SQL 这些查询结果不可更新,请包括ROWID或使用SELECT ...FOR UPDATE 获得可
- k8s java供应链项目篇
- CAD2008 启动慢 卡住
- 基于STM32F103单片机雾霾检测PM2.5检测空气质量检测除尘系统
- 画小米的新Logo只用border-radius可不行!
- stroj uplink
- Linux下识别NTFS格式的U盘
- python 可以处理的任务
- 这是我见过最通俗易懂的MES与ERP介绍文章,带你剖析工业4.0!
- 计算机应用技术与物联网专业介绍,《物联网应用技术》专业简介
- 和你播放器说“分手”吧
- Android Http 下载
- 如何取消金山快盘自动启动
- 易飞ERP 算号服务 注册服务 服务器迁移 实施 二开 全版本
热门文章
- “捉迷藏”也能学习?OpenAI用其教会AI团队合作!
- 计算机科学与技术 网瘾,曾经电击治疗网瘾的杨永信,受无数家长追捧,现在如何了?...
- excel报表技巧:几个关于汇报演示方面的小功能
- java 泛型 PECS准则
- win7+ubuntu 20.0双系统安装
- 重复数据删除和压缩处理
- Python 爬虫的工具列表( 附Github代码下载链接)
- 爱立信股价持续下跌 股东欲撤换CEO
- Java面试通关秘籍(一)
- springboot项目jsp在线引用jquery