请选择 进入手机版 | 继续访问电脑版

HTML5星空

Apache Spark的架构模式你了解哪些?

[复制链接]
发表于 2020-6-28 18:24:56 | 显示全部楼层 |阅读模式




点击上方蓝字关注我们







01
背景

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架。,Spark拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

Spark 启用了内存分布数据集(Resilient distribute data set),除了能够提供交互式查询外,它还可以优化迭代 工作负载。Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。Apache Spark是专为大规 模数据处理而设计的快速通用的计算引擎。现在形成一个高速发展应用广泛的生态系统 。


Spark与Hadoop的关系

Spark计算是对Hadoop传统MapReduce计算的升级和优化,可以理解如果没有hadoop大数据的实战和演变就没 有spark计算,通俗的理解为Hadoop的MapReduce类似于解决了大数据的物质文明需求,还处于初始阶段人们对大数据计算的性能的要求,也就是说能保证在合理的时间范围内达到对数据的初步计算;而Spark的诞生Spark是 在考虑速度和效率,因此在在这个层面上Spark算是解决精神文明层面的问题

hadoop:基于磁盘迭代计算,在做n次迭代过程中,因为所有的结果都是存储在磁盘,就导致在多次迭代计算中带来更多延迟。基于进程。

Spark:基于内存迭代计算,可以将数据缓存在内存中,这就为后续的迭代计算提供了便捷。基于线程。Spark的内存计算并不意味着Spark的内存大小必须和数据大小进行匹配(内存不足,可以使用磁盘缓存),spark可以计算任意大小的数据。



02
Spark的简史

1、2009年,Spark诞生于伯克利大学AMPLab,属于伯克利大学的研究性项目;

2、2010 年,通过BSD 许可协议正式对外开源发布;

3、2012年,Spark第一篇论文发布,第一个正式版(Spark 0.6.0)发布;

4、2013年,成为了Aparch基金项目;发布Spark Streaming、Spark Mllib(机器学习)、Shark(Spark on Hadoop);

5、2014 年,Spark 成为 Apache 的顶级项目;5 月底 Spark1.0.0 发布;发布 Spark Graphx(图计算)、Spark SQL代替Shark;

6、2015年,推出DataFrame(大数据分析);2015年至今,Spark在国内IT行业变得愈发火爆,大量的公司开始重点部署或者使用Spark来替代MapReduce、Hive、Storm等传统的大数据计算框架;

7、2016年,推出dataset(更强的数据分析手段);

8、2017年,structured streaming 发布;

9、2018年,Spark2.4.0发布,成为全球最大的开源项目。

10、2020年6月10日,Spark快速迭代到3.0.0版本,将性能提升到Spark2.4.0版本的两倍。


Spark核心组件

Spark Core;Spark 核心 API,提供 DAG 分布式内存计算框架

Spark SQL:提供交互式查询 API

Spark Streaming:实时流处理

SparkML:机器学习 API

Spark Graphx:图形计算



03
Spark架构

Spark可在Hadoop,Apache Mesos,Kubernetes,独立或云中运行。它可以访问各种数据源。可以在EC2Hadoop YARNMesosKubernetes上使用其独立集群模式运行Spark 。访问HDFS, Alluxio, Apache Cassandra, Apache HBase, Apache Hive以及数百种其他数据源中的数据。


Spark on standalone

01

Driver运行在Worker


角色介绍

Client:客户端进程,负责提交作业到Master

MasterStandalone模式中主控节点,负责接收Client提交的作业,管理Worker,并命令Worker启动Driver Executor

WorkerStandalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动DriverExecutor

Driver 一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业的解析、生成Stage并调度TaskExecutor上。包括DAGSchedulerTaskScheduler

Executor:即真正执行作业的地方,一个集群一般包含多个Executor,每个Executor接收Driver的命令Launch Task,一个Executor可以执行一到多个Task 


作业执行流程

1.客户端提交作业给Master

2.Master让一个Worker启动Driver,即SchedulerBackendWorker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。

3.另外Master还会让其余Worker启动Exeuctor,即ExecutorBackendWorker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。

4.ExecutorBackend启动后会向DriverSchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stagetask,都会被存放到TaskScheduler中,ExecutorBackendSchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。

5.所有stage都完成后作业结束。


02

Driver运行在Client


作业执行流程

1.客户端启动后直接运行用户程序,启动Driver相关的工作:DAGSchedulerBlockManagerMaster等。

2.客户端的DriverMaster注册。

3.Master还会让Worker启动ExeuctorWorker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。

4.ExecutorBackend启动后会向DriverSchedulerBackend注册。DriverDAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。

5.所有stage都完成后作业结束。


Spark on yarn

这里Spark AppMaster相当于Standalone模式下的SchedulerBackendExecutor相当于standaloneExecutorBackendspark AppMaster中包括DAGSchedulerYarnClusterScheduler


作业执行流程

1. 设置环境变量spark.local.dirspark.ui.portNodeManager启动ApplicationMaster的时候会传递LOCAL_DIRSYARN_LOCAL_DIRS)变量,这个变量会被设置为spark.local.dir的值。后续临时文件会存放在此目录下。

2. 获取NodeManager传递给ApplicationMasterappAttemptId

3. 创建AMRMClient,即ApplicationMasterResourceManager的通信连接。

4. 启动用户程序,startUserClass(),使用一个线程通过发射调用用户程序的main方法。这时候,用户程序中会初始化SparkContext,它包含DAGSchedulerTaskScheduler

5. ResourceManager注册。

6. ResourceManager申请containers,它根据输入数据和请求的资源,调度Executor到相应的NodeManager上,这里的调度算法会考虑输入数据的locality


Spark on kubernetes

Kubernetes1.6+的版本支持Spark和Flink直接使用kubernetes作为集群管理器(Cluster Manager)的部署方式,这种部署方式目前还不是很成熟,尤其flink还在孵化阶段,目前稳定使用的是基于Kubernetes的standalone集群模式。大体过程如下:

1、确保kubernetes集群正常运行。

2、创建namespace、serviceAccount。

3、namespace、serviceAccount进行权限绑定。

4、创建master和worker的deployment。

5、暴露service。

6、建立checkpoint的存储系统。

详细在kubernetes集群上部署spark、flink并实现持久化与job自动提交的方案将在flink篇幅中详细介绍。


扫码关注我们

图文:李建斌

云原生研发团队



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多资源及Java+大数据个人原创视频,
可关注本站官方公众号观看:
快讯

     京ICP备14042305号

html5star team © 2012-2013 html5星空 Comsenz Inc.

GMT+8, 2020-7-12 04:03 , Processed in 0.290623 second(s), 36 queries .

快速回复 返回顶部 返回列表