Spark引擎原理 | 青训营笔记

222 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

💨Spark介绍

💨大数据处理引擎

🚩批试计算:Map Reduce 、 Spark 、HIVE

🚩流式计算:Flink

🚩OLAP系统:presto、ClickHouse、Impala、DORIS

💨Spark概念

是一种"One Stack to rule them all"的大数据计算框架,期望使用一个技术堆栈就完美地解决大数据领域的各种计算任务。

Apache官方,对Spark的定义就是:通用的大数据快速处理引擎。

🎈spark能干什么

Spark使用Spark RDD、Spark SQL、 Spark Streaming,MLlib,GraphX成功解决了大数据领城中,离线批处理、交互式查询、实时流计算、机器学习与图计算等最重要的任务和问题。

🎈spark包含的常见计算框架

🚩Spark,是一种通用的大数据计算框架,I正如传统大数据技术Hadoop的MapReduce、Hive引擎,以及Storm流式实时计算引擎等
🚩Spark包含了大数据领城常见的各种计算框架:比如Spark Core用于离线计算,Spark SQL用于交互式查询,Spark Streaming用于实时流式计算,Spark MILlib用于机器学习,Spark GraphX用于图计算。 

💨Spark的特点

🚩统一引擎,支持多种分布式场景
🚩多语言支持
🚩可读写丰富数据源
🚩丰富灵活的API/算子
🚩支持K8S/YARN/Mesos资源调度

spark将每个任务构建成DAG进行计算,内部的计算过程通过弹性式分布式数据集RDD在内存在进行计算,相比于hadoop的mapreduce效率提升了100倍。

spark 提供了大量的算子,开发只需调用相关api进行实现无法关注底层的实现原理。

spark 生态圈丰富,迭代更新快,成为大数据领域必备的计算引擎。

自我思考

spark 计算速度快,易于使用,支持多种的资源管理模式,社区支持。迭代更新快,成为大数据领域必备的计算引擎。

💨SparkCore

🍳SparkCore结构如下

🎈基础配置
🚩SparkConf配置信息
🚩Spark Context (spark上下文)
🚩Spark RPC (过程调用)
🚩ListenerBus (事件总线)
🚩MetricsSystem (度量系统)
🚩SparkEnv (环境变量)

🎈 存储系统
🚩内存
🚩磁盘

🎈计算层
🚩内存管理
🚩任务管理
🚩Task管理
🚩Shuffle管理

🎈调度原理
🚩DAG调度
🚩Task调度

💨RDD

是弹性分布式数据集,是一种容错的、可以被并行操作的元素集合,是Spark对所有数据处理的一种基本抽象。可以通过一系列的算子对rdd进行操作,主要分为Transformation和Action两种操作。

Transformation(转换):是对已有的RDD进行换行生成新的RDD,对于转换过程采用惰性计算机制,不会立即计算出结果。常用的方法有map,filter,flatmap等。
Action(执行):对已有对RDD对数据执行计算产生结果,并将结果返回Driver或者写入到外部存储中。常用到方法有reduce,collect,saveAsTextFile等。

🎈如何创建RDD?

✔内置RDD

ShuffleRDD/HadoopRDDJDBCRDD
/KafkaRDD/ UnionRDD/MapPartitionsRDD/...

✔自定义RDD

class CustomRDD(...) extends RDD {}
实现五要素对应的函数

🎈RDD算子

✔Transform算子:生成一个新的RDD
✔Action算子:触发Job提交

🎈RDD依赖

描述父子RDD之间的依赖关系

🚩窄依赖:父RDD的每个parition至多对应一个子RDD分区。
🚩宽依赖:父RDD的每个partition都可能对应多个子RDD分区。

🎈RDD迭代过程

🚩sparkContext创建RDD对象,计算RDD间的依赖关系,并组成一个DAG有向无环图。
🚩DAGScheduler将DAG划分为多个stage,并将stage对应的TaskSet提交到集群的管理中心,stage的划分依据是RDD中的宽窄依赖,spark遇见宽依赖就会划分为一个stage,每个stage中包含来一个或多个task任务,避免多个stage之间消息传递产生的系统开销。 
🚩taskScheduler 通过集群管理中心为每一个task申请资源并将task提交到worker的节点上进行执行。
🚩worker上的executor执行具体的任务。

💨SparkSQL

🎈概述

前身:shark

🚩shark: 执行计划优化完全依赖于Hive,不方便添加新的优化策略; 
Spark是线程级并行,而MapReduce是进程级并行。 
Spark在兼容Hive的实现上存在线程安全问题,导致Shark 不得不使用另外一套独立维护的打了补丁的Hive源码分支; 

🚩Spark SQL: 作为Spark生态的一员继续发展,而不再受限于Hive, 
只是兼容Hive;Hive on Spark作为Hive的底层引擎之一 
Hive可以采用Map-Reduce、Tez、Spark等引擎

spark sql提供了基于sql的数据处理方法,使得分布式的数据集处理变的更加简单,这也是spark 广泛使用的重要原因。

🎈特点

🚩数据兼容:不仅兼容Hive,还可以从RDD、parquet文件、 Json文件获取数据、 支持从RDBMS获取数据
🚩性能优化:采用内存列式存储、自定义列化器等方式提升性能;
🚩组件扩展: SQL的语法解析器、分析器、优化器都可以重新定义和扩展
🚩兼容: Hive兼容层面仅依赖HiveQL解析、Hive元数据。 从HQL被解析成抽象语法树(AST) 起,就全部由Spark SQL接管了,Spark SQL执行计划生成和优化都 由Catalyst (函数式关系查询优化框架)负责
🚩支持:数据既可以来自RDD,也可以是Hive、HDFS、 Cassandra等外部数据源, 还可以是JSON格式的数 据;

🎈Catalyst优化器

spark sql大致框架如下

**🚩API 层简单的说就是 Spark 会通过一些 API 接受 SQL 语句
****🚩****收到 SQL 语句以后, 将其交给 Catalyst, Catalyst 负责解析 SQL, 生成执行计划等
🚩Catalyst 的输出应该是 RDD 的执行计划
****🚩**最终交由集群运行

🎈自适应查询执行框架(AQE)

AQE 可以理解成是Spark Catalyst 之上的一层,它可以在运行时修改 Spark plan。
AQE 完全基于精确的运行时统计信息进行优化,引入了 Query Stages 的概念 ,并且以 Query Stage 为粒度,进行运行时的优化

自我思考

Spark SQL实际上并不能完全替代Hive,因为Hive是一种基于HDFS的数据仓库,并且提供了基于SQL模型的,针对存储了大数据的数据仓库,进行分布式交互查询的查询引擎。