Spark原理

1. Spark概述

1.1 Spark简介


image-20230417105007791

image-20230417110135444


Spark几个主要特点:

运行速度快:

  1. 基于内存
  2. 采用DAG(有向无环图),能够对相关作业进行优化

容易使用:

  1. 支持scala,java,python,R语言进行编程
  2. 通过SparkShell进行交互式编程

通用型:

  1. 提供了SQL查询,流式计算,机器学习,图算法组件

运行模式多样:

  1. 运行独立集群模式(LOCAL)
  2. 运行hadoop中(集群模式)
  3. 运行在云环境中
  4. 访问HDFS,CASSANDRA,hbase,hive等多种数据源

1.2 Spark与Hadoop的对比

image-20230417110157508


Hadoop缺点:

  1. 表达能力有限:MapReduce,只能通过map(),reduce()两大函数处理业务逻辑,有时候可能无法处理
  2. 磁盘IO开销大:map和reduce两个阶段的溢写和shuffle阶段,都会涉及多次的IO读写,磁盘开销较大
  3. 延迟高:两阶段执行,任务之间键值对的传递,磁盘的读写,以及reduce必须等map执行为完成才能执行等因素,导致执行时间较长

image-20230417111349203

image-20230417111424083


相比于Hadoop Mapreduce,Spark主要具有以下优点:

  1. 计算模型基于MapReduce,不只是map和reduce两大操作,还提供了多种数据集操作类型(函数),编程模型更灵活
  2. 基于内存计算,中间结果放到内存中,迭代运算效率更高
  3. spark基于DAG(有向无环图)任务调度机制,优于Hadoop MapReduce的迭代执行机制

Spark执行效率时Hadoop的100倍


1.3 总结与思考⭐

1)Spark主要特点

image-20230519141805631

2)Hadoop缺点


Hadoop缺点:

  1. 表达能力有限:MapReduce,只能通过map(),reduce()两大函数处理业务逻辑,有时候可能无法处理
  2. 磁盘IO开销大:map和reduce两个阶段的溢写和shuffle阶段,都会涉及多次的IO读写,磁盘开销较大
  3. 延迟高:两阶段执行,任务之间键值对的传递,磁盘的读写,以及reduce必须等map执行为完成才能执行等因素,导致执行时间较长

3)Spark优点


相比于Hadoop Mapreduce,Spark主要具有以下优点:

  1. 计算模型基于MapReduce,不只是map和reduce两大操作,还提供了多种数据集操作类型(函数),编程模型更灵活
  2. 基于内存计算,中间结果放到内存中,迭代运算效率更高
  3. spark基于DAG(有向无环图)任务调度机制,优于Hadoop MapReduce的迭代执行机制

Spark执行效率时Hadoop的100倍


4)思考


优势可总结为两点,一是速度快,二是组件多,适用不同场景


2.Spark生态系统

2.1 Spark应用场景


image-20230417112020877


  1. 复杂批量数据处理:时间跨度十分钟到数小时
  2. 基于历史数据的交互式查询:时间跨度数十秒到数分钟
  3. 基于实时数据流的数据处理:数百毫秒到数秒

同时存在以上三种场景时,需要同时部署三种软件:

比如:MapReduce / Impala / Storm

带来的问题:

  1. 不同场景的数据无法共享,通常需要进行转换
  2. 不通框架需要不同的开发维护团队,成本较高
  3. 难以对同一个集群中各个系统,进行统一的资源协调和分配(yarn不可以吗??YARN只能对同一个系统中的资源进行调度)

image-20230417112328678


Spark优势

  1. 同时满足多种业务场景,SQL即席查询/实时流式计算/机器学习/图计算
  2. 可以部署到yarn上,进行统一资源调度

2.2 BDAS架构图


image-20230417112739568


Mesos:调度器

S3:亚马逊的分布式文件存储系统

Tachyon:基于内存的分布式存储系统

访问接口:

Spark Streaming/Structured Streaming : 流式计算

Spark SQL:SQL即席查询

GraphX: 图计算

MLlib:机器学习


image-20230417162652835


Strom:推特

S4:亚马逊


2.3 总结与思考⭐

1)Spark的应用场景

image-20230519143206548

2)Spark优势

  • 同时满足多种业务场景,SQL即席查询/实时流式计算/机器学习/图计算
  • 可以部署到yarn上,进行统一资源调度

3)BDAS架构图

image-20230519143328376

4)一点思考

CDH也可以集成spark-sql模块,并通过hue进行查询


3.Spark运行结构⭐⭐⭐

3.1 基本概念


image-20230417163744713


RDD:Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的抽象概念,共享内存模型,通俗比喻:大麻袋

DAG: Directed Acyclic Grapg(有向无环图),反映RDD之间的依赖关系

Executor:运行再工作节点(WorkerNode)的一个进程,负责运行Task

应用(Application):用户编写的Spark程序

任务(Task):运行再Executor上的工作单元

作业(Job):一个作业包含多个RDD及作用于相应RDD上的各种操作

阶段(STAGE):是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为阶段,或者也被称为任务集合,代表了一组关联的,相互之间没有Shuffle依赖关系的任务组成的任务集


3.2 架构设计

image-20230417163824628

image-20230417163908707


3.3 Spark运行基本流程


image-20230417164333113


通过创建SparkContext对象,获取和一个集群的连接(SparkShell中默认创建好了)


3.4 RDD运行原理


3.4.1 RDD设计背景

image-20230417165011816


序列化开销:内存文件写到磁盘会产生序列化的过程

实现管道化,一个结果的输出成为另外一个数据集的输入,避免中间写磁盘


3.4.2 RDD概念

image-20230417165342301


RDD高度受限的共享内存模型,只读

例如加10分的业务场景:需要给RDD进行转换,转换过程中加10分 ,形成新的RDD

RDD提高了两种类型的数据运算:

1)Action

2)Transformation,并不会实际发生转换,只有执行Action转换时,才发生转换(惰性机制),接口简单,类似map,filter,groupby,join等粗粒度的数据转换操作

Spark用Scala实现RDD的API,效率最高


image-20230418091920957


image-20230418091939271


Spark的优点

惰性调用,管道化---》避免同步等待---》不需要保存中间结果


3.4.3 RDD特性


1)容错性,具有清晰的数据血缘关系图,方便数据追溯

2)中间结果存储在内存当中,避免了读写磁盘

3)避免了读写磁盘,就避免了序列化和反序列化


image-20230418092753195


3.4.4 RDD之间的依赖关系


image-20230418092908749

image-20230418092925747


Shuffle:把键相同的键值对,通过shffle(洗牌)机制,洗到一个reduce任务中,shuffle过程会涉及大量的网络数据分发!

是否涉及Shuffle是判断宽窄依赖的重要依据

包含Shuffle就是宽依赖


image-20230418093407043


窄依赖:平行线

宽依赖:交叉线,发生了shuffle


3.4.5 Stage阶段的划分


image-20230418093603257


窄依赖不涉及shuffle操作,对作业的优化更有利。

在划分Stage的过程中:

1)反向解析,遇到宽依赖断开

2)遇到窄依赖就把当前RDD加入STAGE中

3)把窄依赖尽量划分到同一个STAGE中


image-20230418094040966


Stage2中的任务都是并行执行


3.4.6 RDD运行过程


image-20230418094424419


3.5 思考与总结⭐

1)Spark速度快的原因

  • 中间结果存储在内存当中,减少了与磁盘的读写
  • 惰性机制,只在执行Action算子时,才发生实际的计算
  • 管道化,不需要保留中间结果,

2)shuffle洗牌⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

  • Spark中的 Shuffle 是一种用于重新分配 RDD 中数据的操作,它可以将 RDD 中的数据根据某种特征进行分组,然后将这些分组的数据分配到不同的节点上进行计算,从而提高计算效率。
  • 可以通过调整shffule相关的参数来优化Spark程序性能
  • 通过是否发生shuffle,来判断宽窄依赖,根据宽窄依赖来划分stage阶段;遇到宽依赖就断开,遇到窄依赖,就把当前的RDD加入到stage当中,将窄依赖划分到一个Stage当中,可以实现流水线计算

image-20230519161535853

3)RDD运行过程

image-20230519161721343

4.Spark的部署方式

image-20230418094635517

Spark和Mesos是同一个团队开发的,具有更好的血缘关系


5.Spark和FLink的对比

image-20230418095047828


Flink:面向流数据处理思维

Spark:面向批数据处理思维

Flink(林子雨):网易云课堂教学视频


image-20230418095602195

image-20230418095648350

image-20230418095659643

image-20230418095759383


Flink优于Spark和Hadoop最主要的原因:Flink支持增量迭代,具有对迭代自动优化的功能。


image-20230418095956760


5.1 思考与总结⭐

1)Spark和Flink的区别

  • Spark基于批计算模拟流计算,Flink基于流计算模拟批计算

  • 批计算分割的再细,也不能小于1s,有很大的局限性,flink可以实现毫秒级别计算

  • FLink更契合Yarn,同时支持增量迭代,具有对迭代自动优化的功能。

  • 批处理用Spark,流处理用Flink,不用Storm


6.Spark基础编程⭐⭐⭐⭐⭐

6.1 RDD编程

6.1.1 转换操作

image-20230418101905646

image-20230418101921879

image-20230418101950533

image-20230418102041280


6.1.2 行动操作


image-20230418102307058


6.1.3 实例1


image-20230418102342560


6.1.4 实例2


image-20230418102435011


6.2 DataFrame编程


6.2.1 DataFrame简介


image-20230418102757133


DataFrame对RDD的拆解,基于RDD

最终都会通过Catalyst转换为底层的RDD(Spark Core)


6.2.2 DataFrame的优点


image-20230418103049953

image-20230418103119404

image-20230418103322312

image-20230418103427931


6.2.3 基于DataFrame的Spark SQL


image-20230418103602385


SparkSQL基于DATAFrame和DATASet

不管是SQL/DataFrame/Dataset,都会通过Catalyst组件,转换为底层的RDD(Spark Core)

而Structured Streaming和MLlib都是基于DataFrame表达查询


image-20230418104137622


6.2.4 DataFrame常用操作


1)DSL语法风格

image-20230418104427378

image-20230418104449629

image-20230418104505874

image-20230418104526471

image-20230418104533735


2)SQL语法风格


image-20230418104611180

image-20230418104652317

image-20230418104707785


6.3 DataSet编程


6.3.1 DataFrame / DataSet / RDD的区别

1)DataFrame / DataSet / RDD关系


image-20230418104847682


DataSet是对DataFrame的扩展

Spark2.0,DataSet包含了DataFrame功能

面向DataSet,DataFrame编程,无论是SQL/DSL,本质都会转换为RDD操作


2)DataFrame / DataSet / RDD具体数据

image-20230418105135805

image-20230418105152507

image-20230418105216000


3)DataFrame / DataSet / RDD 优化


image-20230418105255458


DataFrame和DataSet的查询计划可以通过SparkSQL进行优化。

RDD本身不具备查询优化功能。

DataFrame和DataSet底层都是基于RDD实现的。


4)DataFrame / DataSet / RDD优缺点

image-20230418105650994

image-20230418110020224

image-20230418110148940


5)DataFrame/DataSet/RDD的适用场景


image-20230418110251611


企业级开发,更多使用高层的DataFrame,DataSet

如果需要更多控制功能,使用RDD


image-20230418110502798


DataFrame 和 DataSet 自动优化,提升开发效率。

RDD处理非结构化数据,例如文本流数据,具有优势。


6.3.2 DataFrame/DataSet/RDD的相互转换

image-20230418110646776


6.3.3 DataSet编程实例


image-20230418110805534


image-20230418110816248


6.4 思考与总结⭐⭐⭐⭐⭐⭐

1)RDD编程

  • 转换算子:不发生实际计算,只记录轨迹

image-20230519162926898

  • 执行算子:发生实际计算的地方,会加载文件,通过一次次的转换,到计算出最后的结果

image-20230519163300702

2)DataFrame编程

  • DataFrame是对RDD更详细的描述

image-20230519163415916

  • 性能优越,具备更好的表达能力(就像RDD只能描述到车,但DataFrame可以描述到小车/客车/货车)
  • 基于DataFrame的Spark SQL

SparkSQL基于DATAFrame和DATASet

不管是SQL/DataFrame/Dataset,都会通过Catalyst组件,转换为底层的RDD(Spark Core)

而Structured Streaming和MLlib都是基于DataFrame表达查询

  • DataFrame常用操作:DSL语法风格和SQL风格

3)DataSet编程实例

  • DataSet是对DataFrame的扩展

  • Spark2.0,DataSet包含了DataFrame功能

  • 面向DataSet,DataFrame编程,无论是SQL/DSL,本质都会转换为RDD操作

image-20230519164755241

image-20230519164823450

4.总结

image-20230418110953541

posted @ 2023-06-28 16:19  付十一。  阅读(62)  评论(0)    收藏  举报