Spark最初由美国加州伯克利大学 ( UC Berkeley )的AMP实验室于2009年开发,是基于内存
计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序
2013年Spark加入Apache孵化器项目后发展迅猛,如今己成为Apache软件基金会最重要的三大分布式计算系统开源项目之一 ( Hadoop、Spark、 Storm )
Spark的发展趋势
Scala是一门现代的多范式编程语言
注意:虽然Scala是Spark的主要编程语言,但Spark还支持Java、Python、R作为编程语言
Scala的优势是提供了REPL(Read-Eval-Print Loop,交互式解释器),提高程序开发效率
Hadoop的缺点
表达能力有限:并不是所有的任务都能用MapReduce去解决
磁盘IO开销大:所有中间结果需要写到HDFS中去
延迟高
任务之间的衔接涉及IO开销
在前一个任务执行完成之前,其他任务久无法开始,难以胜任复杂、多阶段的计算任务
Spark相比于MapReduce的优点
Hadoop与Spark的执行流程对比
Hadoop与Spark执行逻辑回归的时间对比
大数据处理主要包括以下三个场景类型
当同时存在以上三种场景时,就需要同时部署三种不同的软件
Spark设计:遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统
Spark生态系统
Spark生态系统组件的应用场景
基本概念
RDD:是Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型
DAG:是Directed Acyalic Graph(有向无环图)的简称,反映RDD之问的依赖关系
Executor:是运行在工作节点 (WorkerNode)的一个进程,负责运行Task
Application:用户编写的Spark应用程序
Task:运行在Executor 上的工作单元
Job:一个Job包含多个RDD及作用于相应RDD上的各种操作
Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage, 或者也被称为TaskSet,代表了一组关联的、相互之问没有
Shuffle依赖关系的任务组成的任务集
Spark运行架构
Cluster Manager:集群资源管理器,负责对集群资源的分配和调度
Spark架构设计
Spark中各种概念之间的相互关系
Spark执行Application过程
Spark运行基本流程
2.为Executor分配资源
3.注册并申请Task
4.反馈结果并注销
Spark运行架构特点
设计背景
RDD概念
一个RDD就是一个分布式对象集合,本质上是一个只读
的分布记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以保存到集群中不同节点上,从而可以在集群中的不同节点上进行并行计算
RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join、和group by)而创建得到新的RDD
RDD的典型执行过程如下
RDD执行过程实例
RDD最后一步Action操作才会生成具体结果
优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单
Spark采用RDD以后能够实现高效计算的原因
现有容错机制:数据复制或者记录日志;在数据密集型任务中,采用这种方式进行容错的代价昂贵
RDD:血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只计算粗粒度的操作,具有高效的容错性
RDD执行构成有向无环图,若是某个RDD出故障,只需要从它的父RDD重新计算恢复即可
中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
RDD之间的依赖关系(宽依赖、窄依赖)是划分Stage的依据
宽依赖:表现为存在一个父RDD的一个分区对应一个子RDD的多个分区
Stage的划分:Spark通过分析各个RDD的依赖关系生成DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分Stage
具体划分方法:
Stage划分举例:
Stage类型:
RDD运行过程:
Shark(Hive on Spark
)
其执行步骤只在生成执行计划时有区别,其可能带来的问题:
执行计划优化完全依赖于Hive,不方便添加新的优化策略
Spark是线程级的并行,而MapReduce是进程级并行,因此Spark在兼容Hive的实现上存在线程安全问题,导致Shark不得不使用另外一套独立维护的打了补丁的Hive源码分支
因此Shark被停止开发
Spark SQL架构
Spark SQL目前支持Scala、Java、Python三种语言、支持SQL-92规范
Spark三种部署方式
Standalone:类似于MapReduce1.0,slot为资源分配单位
Spark on Mesos:Mesos也是一个资源管理框架,它和Spark有一定的亲缘关系
Spark on Yarn:
企业部署大数据分析平台的案例
而用Spark架构可以同时满足批处理和流处理需求:
注意,Spark Streaming无法实现毫秒级别的流计算,因此,对于需要毫秒级别实时响应的企业应用而言,仍然需要采用流计算框架(如Storm)
用Spark架构的优点:
企业采用Hadoop和Spark统一部署的原因
由于Hadoop生态系统中的一些组件所实现的功能,目前还是无法由Spark取代
现有的Hadoop组件开发的应用,完全转移到Spark上需要一定的成本
不同的计算框架统一运行在YARN中,可以带来如下好处
见:Spark安装和编程实践(Spark3.4.0)_厦大数据库实验室博客 (xmu.edu.cn)
基本步骤
示例
Spark RDD支持的两种类型操作
Spark常用API介绍
常用Action API:动作API得到的是一个结果,而不是RDD
常用Transformation API介绍:转换API得到的是RDD的中间结果
常用API举例
API可以使用链式操作进行连续计算,可以让Spark代码更加简洁
Spark属于MapReduce计算模型,因此也可以实现MapReduce的计算过程
见:Spark安装和编程实践(Spark3.4.0)_厦大数据库实验室博客 (xmu.edu.cn)