spark 核心原理及运行架构

spark 系列

spark 核心原理及运行架构

spark 常用算子大全



前言

本篇博客将为大家带来 spark 核心原理和运行架构的介绍。这是 spark 系列的第一篇博客,具体如下:


Spark 简介

Spark 发展史

大数据、人工智能( Artificial Intelligence )像当年的石油、电力一样, 正以前所未有的广度和深度影响所有的行业, 现在及未来公司的核心壁垒是数据, 核心竞争力来自基于大数据的人工智能的竞争。

Spark 是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台

2009年诞生于美国加州大学伯克利分校AMP 实验室。

2010年通过BSD许可协议开源发布。

2013年捐赠给Apache软件基金会并切换开源协议到切换许可协议至 Apache2.0。

2014年2月,Spark 成为 Apache 的顶级项目。

2014年11月, Spark的母公司Databricks团队使用Spark刷新数据排序世界记录。

Spark 成功构建起了一体化、多元化的大数据处理体系。在任何规模的数据计算中, Spark 在性能和扩展性上都更具优势

Hadoop 之父Doug Cutting 指出:

Use of MapReduce engine for Big Data projects will decline, replaced by Apache Spark (大数据项目的MapReduce 引擎的使用将下降,由Apache Spark 取代)

Hadoop 商业发行版本的市场领导者Cloudera 、HortonWorks 、MapR 纷纷转投Spark,并把Spark 作为大数据解决方案的首选和核心计算引擎

2014 年的如此Benchmark 测试中, Spark 秒杀Hadoop ,在使用十分之一计算资源的情况下,相同数据的排序上, Spark 比Map Reduce 快3 倍! 在没有官方PB 排序对比的情况下,首次将S park 推到了IPB 数据(十万亿条记录) 的排序,在使用190 个节点的情况下,工作负载在4 小时内完成, 同样远超雅虎之前使用3800 台主机耗时16 个小时的记录。

2015年6月, Spark 最大的集群来自腾讯–8000 个节点, 单个Job 最大分别是阿里巴巴和Databricks–1PB ,震撼人心!同时,Spark的Contributor 比2014 年涨了3 倍,达到730 人:总代码行数也比2014 年涨了2 倍多,达到40 万行。

IBM 于2015 年6 月承诺大力推进Apache Spark 项目, 并称该项目为:以数据为主导的,未来十年最重要的新的开源项目。这-承诺的核心是将Spark 嵌入IBM 业内领先的分析和商务平台,并将Spark 作为一项服务,在IBMB平台上提供给客户。IBM 还将投入超过3500 名研究和开发人员在全球10余个实验室开展与Spark 相关的项目,并将为Spark 开源生态系统无偿提供突破性的机器学习技术–IBM SystemML。同时,IBM 还将培养超过100 万名Spark 数据科学家和数据工程师。

2016 年,在有“计算界奥运会”之称的国际著名Sort Benchmark全球数据排序大赛中,由南京大学计算机科学与技术系PASA 大数据实验室、阿里巴巴和Databricks 公司组成的参赛因队NADSort,以144美元的成本完成lOOTB 标准数据集的排序处理,创下了每TB 数据排序1.44美元成本的最新世界纪录,比2014 年夺得冠军的加州大学圣地亚哥分校TritonSort团队每TB 数据4.51美元的成本降低了近70%,而这次比赛依旧使用Apache Spark 大数据计算平台,在大规模并行排序算法以及Spark 系统底层进行了大量的优化,以尽可能提高排序计算性能并降低存储资源开销,确保最终赢得比赛。

在FullStack 理想的指引下,Spark 中的Spark SQL 、SparkStreaming 、MLLib 、GraphX 、R 五大子框架和库之间可以无缝地共享数据和操作, 这不仅打造了Spark 在当今大数据计算领域其他计算框架都无可匹敌的优势, 而且使得Spark 正在加速成为大数据处理中心首选通用计算平台。

Spark是什么?

Apache Spark是用于大规模数据处理的统一分析引擎。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上,形成集群。下图是 spark 官方的介绍:

在这里插入图片描述
更多详情见 spark 官网:http://spark.apachecn.org

Spark 生态及运行原理

spark 生态圈

如下图所示: 目前,Spark已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子项目。
在这里插入图片描述

Spark Core:实现了 Spark 的基本功能,包含RDD、任务调度、内存管理、错误恢复、与存储系统交互等模块。

Spark SQL:Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL操作数据。

Spark Streaming:Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API。

Spark MLlib:提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。

GraphX(图计算):Spark中用于图计算的API,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。

集群管理器:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。

Spark的主要特点

① 运行速度快:Spark拥有DAG执行引擎,基于内存数据处理,比MR快100个数量级以上(逻辑回归算法测试);基于硬盘数据处理,比MR快10个数量级以上。

② 容易使用:支持Java、Scala、Python和R语言等多种语言,数据源丰富,可部署在多种集群中;此外还支持交互式shell,方便开发测试;同时支持超过80种高级算法,使用户可以快速构建不同的应用。

③ 通用性:一栈式解决方案包括大数据分析统计、批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、图计算(Spark MLlib)及机器学习(GraphX)。

④ 运行模式多样:

  1. local本地模式(单机)–开发测试使用:分为local单线程和local-cluster多线程,本机访问命令:spark-shell --master local[*]

  2. standalone独立集群模式–开发测试使用:典型的Mater/slave模式,standalone访问命令:spark-shell --master spark://MASTERHOST:7077

  3. standalone-HA高可用模式–生产环境使用:基于standalone模式,使用zk搭建高可用,避免Master是有单点故障的。

  4. on yarn集群模式–生产环境使用:运行在 yarn 集群之上,由 yarn 负责资源管理,Spark 负责任务调度和计算。它的好处是计算资源按需伸缩,集群利用率高,共享底层存储,避免数据跨集群迁移。 yarn访问命令:spark-shell --master yarn-client

  5. on mesos集群模式–国内使用较少:运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算。

  6. on cloud集群模式–中小公司未来会更多的使用云服务:比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3。。

⑤ 容错性高:Spark引进了弹性分布式数据集RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错。

Spark 与 Hadoop 对比的优势

Spark 产生之前,已经有MapReduce这类非常成熟的计算系统存在了,并提供了高层次的API(map/reduce),把计算运行在集群中并提供容错能力,从而实现分布式计算。

虽然MapReduce提供了对数据访问和计算的抽象,但是对于数据的复用就是简单的将中间数据写到一个稳定的文件系统中(例如HDFS),所以会产生数据的复制备份,磁盘的I/O以及数据的序列化,所以在遇到需要在多个计算之间复用中间结果的操作时效率就会非常的低。而这类操作是非常常见的,例如迭代式计算,交互式数据挖掘,图计算等。

在这里插入图片描述

认识到这个问题后,学术界的 AMPLab 提出了一个新的模型,叫做 RDD。RDD 是一个可以容错且并行的数据结构(其实可以理解成分布式的集合,操作起来和操作本地集合一样简单),它可以让用户显式的将中间结果数据集保存在内存中,并且通过控制数据集的分区来达到数据存放处理最优化.同时 RDD也提供了丰富的 API (map、reduce、foreach、redeceByKey…)来操作数据集。后来 RDD被 AMPLab 在一个叫做 Spark 的框架中提供并开源.
在这里插入图片描述
简而言之,Spark 借鉴了 MapReduce 思想发展而来,保留了其分布式并行计算的优点并改进了其明显的缺陷。让中间数据存储在内存中提高了运行速度、并提供丰富的操作数据的API提高了开发速度。

Spark 与 Hadoop 对照表

HadoopSpark
类型基础平台,包含计算,存储,调度分布式计算工具
场景大规模数据集上的批处理迭代计算,交互式计算,流计算
价格对机器要求低,便宜对内存有要求,相对较贵
编程范式Map+Reduce,API较为底层,算法,适应性差RDD组成DAG有向无环图,API较为顶层,方便使用
数据存储结构MapReduce中间计算结果存在HDFS磁盘上,延迟大RDD中间运算结果存在内存中,延迟小
运行方式Task以进程方式维护,任务启动慢Task以线程方式维护,任务启动快

(1) Hadoop 存在以下缺点:

① 表达能力有限且繁杂,只有Map和Reduce两个操作,复杂的逻辑需要大量的样板代码;

② 磁盘IO开销大、处理效率低;Map中间结果写磁盘,Reduce写HDFS,多个Map通过HDFS交换数据,此外任务调度与启动开销大;

③ 延迟高,不适合迭代处理、交互式处理和流式处理。

(2) Spark主要有如下优点:

① Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更灵活;

② Spark提供了内存计算,中间结果直接存放内存中,大部分不再需要读写HDFS,带来更高的迭代运算效率;

③ Spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制。

Spark使用情况

Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。

当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务;

阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;

腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。

常见问题

1. 美国加州大学伯克利分校提出的数据分析的软件栈BDAS认为目前的大数据处理可以分为哪三个类型?

① 复杂的批量数据处理:时间跨度通常在数十分钟到数小时之间;

② 基于历史数据的交互式查询:时间跨度通常在数十秒到数分钟之间;

③ 基于实时数据流的数据处理:时间跨度通常在数百毫秒到数秒之间。

2. Spark已打造出结构一体化,功能多样化的大数据生态系统,试述Spark的生态系统。

Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成一套完整生态系统,既能够提供内存计算框架,也可以支持SQL即时查询、实时流式计算、机器学习和图计算等。Spark可以部署在资源管理器YARN之上,提供一站式的大数据解决方案。因此,Spark所提供的生态系统同时支持批处理、交互式查询和流数据处理。

3. 从Hadoop+Storm架构转向Spark架构可带来哪些好处?

① 实现一键式安装和配置、线程级别的任务监控和告警;

② 降低硬件集群、软件维护、任务监控和应用开发的难度;

③ 便于做成统一的硬件、计算平台资源池。

spark运行架构

spark基础运行架构图:

在这里插入图片描述
注意:

  • 在驱动程序中,通过SparkContext主导应用的执行
  • SparkContext可以连接不同类型的Cluster Manager(Standalone、YARN、Mesos),连接后,获得集群节点上的Executor
  • 一个Worker节点默认一个Executor,可通过SPARK_WORKER_INSTANCES调整
  • 每个应用获取自己的Executor
  • 每个Task处理一个RDD分区

如上图,可以总结Spark架构核心组件如下表:

术语说明
ApplicationSpark的应用程序,包含一个Driver program和若干Executor
SparkContextSpark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor
Driver Program运行Application的main()函数并且创建SparkContext
Executor是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executor来处理任务
Cluster Manager在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn)
Worker Node集群中任何可以运行Application代码的节点,运行一个或多个Executor进程
Task运行在Executor上的工作单元
JobSparkContext提交的具体Action操作,常和Action对应
Stage每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet
RDDResilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类
DAGScheduler根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
TaskScheduler将Taskset提交给Worker node集群运行并返回结果
TransformationsSpark API的一种类型,Transformation返回值还是一个RDD,所有的Transformation采用的都是懒策略,如果只是将Transformation提交是不会执行计算的
ActionSpark API的一种类型,Action返回值不是一个RDD,而是一个scala集合;计算只有在Action被提交的时候计算才被触发。

spark 作业工作原理

在这里插入图片描述

Spark 运行流程

在这里插入图片描述
Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。

  • Master作为整个集群的控制器,负责整个集群的正常运行;

  • Worker相当于计算节点,接收主节点命令与进行状态汇报;

  • Executor负责任务的执行;

  • Client作为用户的客户端负责提交应用;

  • Driver负责控制一个应用的执行。

Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,Driver和Worker是两个重要角色。Driver 程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。

  • Excecutor /Task 每个程序自有,不同程序互相隔离,task多线程并行

  • 集群对Spark透明,Spark只要能获取相关节点和进程

  • Driver 与Executor保持通信,协作处理

spark 调优策略

APP调度

默认情况下,用户向以Standalone模式运行的Spark集群提交的应用使用FIFO(先进先出)的顺序进行调度。 每个应用会独占所有可用节点的资源。用户可以通过配置参数spark.cores.max决定一个应用可以在整个集群申请的CPU core数。 注意,这个参数不是控制单节点可用多少核。如果用户没有配置这个参数,则在Standalone模式下,默认每个应用可以分配由参数spark.deploy.defaultCores决定的可用核数。

算法对应的类

  • FIFO:FIFOSchedulingAlgorithm
  • FAIR:FairSchedulingAlgorithm

JOB调度

Action 触发的JOB的本质就是调用了SparkContent 的runjob方法。JOB的调度在FIFO与FAIR的行为有点不同。

  • FIFO
    在默认情况下,Spark的调度器以FIFO(先进先出)方式调度Job的执行。每个Job被切分为多个Stage。第一个Job优先获取所有可用的资源,接下来第二个Job再获取剩余资源。以此类推,如果第一个Job并没有占用所有的资源,则第二个Job还可以继续获取剩余资源,这样多个Job可以并行运行。如果第一个Job很大,占用所有资源,则第二个Job就需要等待第一个任务执行完,释放空余资源,再申请和分配Job。

  • FAIR
    在FAIR共享模式调度下,Spark在多Job之间以轮询(roundrobin)方式为任务分配资源,所有的任务拥有大致相当的优先级来共享集群的资源。这就意味着当一个长任务正在执行时,短任务仍可以分配到资源,提交并执行,并且获得不错的响应时间。 这样就不用像以前一样需要等待长任务执行完才可以。 这种调度模式很适合多用户的场景。用户可以通过配置spark.scheduler.mode方式来让应用以FAIR模式调度。FAIR调度器同样支持将Job分组加入调度池中调度,用户可以同时针对不同优先级对每个调度池配置不同的调度权重在默认情况下,每个调度池拥有相同的优先级来共享整个集群的资源,同样defaultpool中的每个Job也拥有同样优先级进行资源共享,但是在用户创建的每个资源池中,Job是通过FIFO方式进行调度的。

Stage调度

每个Stage对应的一个TaskSetManager,通过Stage回溯到最源头缺失的Stage提交到调度池pool中,在调度池中,这些TaskSetMananger又会根据Job ID排序,先提交的Job的TaskSetManager优先调度,然后一个Job内的TaskSetManager ID小的先调度,并且如果有未执行完的父母Stage的TaskSetManager,则是不会提交到调度池中。

Task调度

当Stage不存在缺失的ParentStage时,会将其转换为TaskSet并提交。转换时依Stage类型进行转换:将ResultStage转换成ResultTask, ShuffleMapStage转换成ShuffleMapTask. Task个数由Stage中finalRDD 的分区数决定。

当转换成的TaskSet提交之后,将其通过taskScheduler包装成TaskSetManager并添加至调度队列中(Pool),等待调度。在包装成TaskSetManager时,根据task的preferredLocatitions将任务分类存放在pendingTasksForExecutor, pendingTaskForHost, pendingTasksForRack, pendingTaskWithNoPrefs及allPendingTasks中, 前三个列表是是包含关系(本地性越来越低),范围起来越大,例如:在pendingTasksForExecutor也在pendingTaskForHost,pendingTasksForRack中, 分类的目的是在调度时,依次由本地性高à低的查找task。

在进行Task调度时,首先根据调度策略将可调度所有taskset进行排序,然后对排好序的taskset待调度列表中的taskset,按序进行分配Executor。再分配Executor时,然后逐个为Executor列表中可用的Executor在此次选择的taskset中按本地性由高到低查找适配任务。此处任务调度为延迟调度,即若本次调度时间距上一任务结束时间小于当前本地性配制时间则等待,若过了配制时间,本地性要求逐渐降低,再去查找适配的task。当选定某一task后后将其加入runningtask列表,当其执行完成时会加入success列表,下次调度时就会过滤过存在这两个列表中的任务,避免重复调度。

当一个任务执行结束时,会将其从runningtask中移除,并加入success,并会适放其占用的执行资源,供后序task使用, 将判断其执行成功的task数与此taskset任务总数相等时,意为taskset中所有任务执行结束,也就是taskset结束。此时会将taskset移除出可调度队列。

重复上述过程直到taskset待调度列表为空。即所有作业(job)执行完成。

总结:整体的Task分发由TaskSchedulerImpl来实现,但是Task的调度(本质上是Task在哪个分区执行)逻辑由TaskSetManager完成。 这个类监控整个任务的生命周期,当任务失败时(如执行时间超过一定的阈值),重新调度,也会通过delay scheduling进行基于位置感知(locality-aware)的任务调度。

参考文章

spark 发展史

spark 核心原理

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值