这是我参与「第四届青训营 」笔记创作活动的第4天。
Spark介绍
- 处理大规模批数据的计算引擎、基于内存、是MR的优化
- 支持单机与集群、支持批(2.0后支持流处理)
- 支持通过SparkSQL查询DB数据,提供了丰富的API
- Spark中Task以线程Thread方式运行,线程Thread运行在进程Process中,启动和销毁相对于进程更快
SparkCore原理
- RDD(Resilient Distributed Dataset):一种分布式内存抽象,用于在大规模集群中做内存计算,是Spark的核心数据结构,Spark API的操作依赖RDD。将要处理的数据封装到RDD中,调用RDD中的函数处理数据。RDD数据可以放到内存中,内存不足可以持久化到磁盘中。
- RDD算子
- Transform算子:生成一个新的RDD
- Map,filter,groupBy,join, union,reduce,sort,partitionBy
- Action算子:触发Job提交,形成DAG图提交给Spark集群运行得到结果。
- count,collect,take,save, show
- Transform算子:生成一个新的RDD
- RDD依赖
- 窄依赖:父RDD的每个partition至多对应一个子RDD分区。
- 宽依赖:父RDD的每个partition都可能对应多个子RDD分区。
- TaskSchduler(任务调度器):根据调度算法(FIFO/FAIR)对多个TaskSet进行调度,将Task调度(locality)到相关Executor上面执行,
- Executor内存主要有两类: Storage、Execution
SparkSQL
- Spark SQL作为分布式SQL查询引擎,提供了一个最核心数据抽象DataFrame。
- Spark SQL是将 SQL转换成一个job,提交到Spark集群上运行,类似Hive,兼容 Hive。
- Spark SQL的核心是Catalyst查询,将SQL/Dataset/DataFrame经过一系列操作转化为Spark系统中执行的RDD。
- Spark SQL的两种优化器
- 基于规则的优化器(Rule-Based Optimization,RBO):根据指定的规则规范SQL的编写,使job不受DB中数据的内容影响。
- 基于代价的优化器(Cost-Based Optimization,CBO):对关系表达式进行转换,根据物理执行计划选最优。
- Spark 3.0新增自适应查询执行框架(AQE):可在运行时基于精确的运行时统计信息,通过修改Spark plan来优化。