关于存算分离

目前企业级的大数据应用主流还是采用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 部署及入门示例相关推荐

  1. Spark on k8s Operator 部署安装

    Spark on k8s Operator 部署安装 1. 背景 受限于公司内网环境,无法构建梯子及部分网络策略,不能使用网络资源直接部署,需要手动编译安装 2. 环境准备 centos 7 Kube ...

  2. flink1.12.0学习笔记第1篇-部署与入门

    flink1.12.0学习笔记第 1 篇-部署与入门 flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇-高级 ...

  3. 24.大数据学习之旅——spark手把手带你入门

    Spark介绍 Apache Spark™ is a fast and general engine for large-scale data processing. Spark Introduce ...

  4. Apache Spark处理大数据入门,看这一篇就够了

    作者 Srini Penchikala ,译者 丛一 什么是Spark Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab ...

  5. kettle 笛卡尔_Kettle-Spoon入门示例

    Spoon 是Kettle的设计调试工具 1.           微软ETL与Java 开源Kettle做下对比 微软Integration Services 项目 测试(仅2008版做比较,更高版 ...

  6. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  7. Spring MVC 入门示例讲解

    在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...

  8. Restlet入门示例

    http://cunfu.iteye.com/blog/757467 本文的目的在于完成一个Restlet入门示例. 首先,是一个Stand alone应用. 然后,将其部署与Tomcat容器中. 最 ...

  9. JVM插桩之一:JVM字节码增强技术介绍及入门示例

    字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...

最新文章

  1. 关于PCA算法的一点学习总结
  2. 使用深度学习和OpenCV的早期火灾检测系统
  3. pandas之loc iloc ix
  4. 【解决】insert 语句无效果,在查询中正常运行问题
  5. sql常识- UNIQUE
  6. 怪兽充电启动招股:2020年业绩下滑五成,小米、高瓴参与认购
  7. oracle PL/SQL 这些查询结果不可更新,请包括ROWID或使用SELECT ...FOR UPDATE 获得可
  8. k8s java供应链项目篇
  9. CAD2008 启动慢 卡住
  10. 基于STM32F103单片机雾霾检测PM2.5检测空气质量检测除尘系统
  11. 画小米的新Logo只用border-radius可不行!
  12. stroj uplink
  13. Linux下识别NTFS格式的U盘
  14. python 可以处理的任务
  15. 这是我见过最通俗易懂的MES与ERP介绍文章,带你剖析工业4.0!
  16. 计算机应用技术与物联网专业介绍,《物联网应用技术》专业简介
  17. 和你播放器说“分手”吧
  18. Android Http 下载
  19. 如何取消金山快盘自动启动
  20. 易飞ERP 算号服务 注册服务 服务器迁移 实施 二开 全版本

热门文章

  1. “捉迷藏”也能学习?OpenAI用其教会AI团队合作!
  2. 计算机科学与技术 网瘾,曾经电击治疗网瘾的杨永信,受无数家长追捧,现在如何了?...
  3. excel报表技巧:几个关于汇报演示方面的小功能
  4. java 泛型 PECS准则
  5. win7+ubuntu 20.0双系统安装
  6. 重复数据删除和压缩处理
  7. Python 爬虫的工具列表( 附Github代码下载链接)
  8. 爱立信股价持续下跌 股东欲撤换CEO
  9. Java面试通关秘籍(一)
  10. springboot项目jsp在线引用jquery