这是我参与「第四届青训营」笔记创作活动的第6天。
知识点小记
Spark运行架构
图源:青训营课堂
SparkCore:Spark的核心组件,实现了Spark的基本功能,包括任务调度、内存管理、错误的恢复、存储系统交互等。
SparkSQL:操作结构化数据的核心的组件,可以通过SparkSQL直接查询Hive、HBase等各种各样的数据源,可以进行交互式的查询。
Spark Structured Streaming:建立在SparkSQL上面的,是Spark提供的流式计算框架,来支出高吞吐、可容错处理的实时流式数据。
MLlib:Spark提供的关于机器学习的算法库,比如常见的分类、回归、聚类、协同过滤这样的算法。
GraphX:分布式的图处理框架。拥有图计算、图挖掘算法的API的接口。
可以看出,Spark提供了统一的引擎、支持多种分布式场景。支持多语言、可以读写丰富的数据源、支持各种各样的资源调度。
SparkCore
图源:青训营课堂
RDD是什么
spark从数据的输入到结果的输出中间的所有数据结构都是基于RDD的。RDD是一个容错的,可以并行执行的一个数据集,是spark中最基本的数据处理的模型,是SparkCore的一个核心概念。
RDD的五个特性
- 分区列表:每个RDD都会有多个分区,这些分区运行在集群的不同节点上,每个分区都会被一个计算任务处理的task来处理,分区决定了并行执行的数量,在创建RDD的时候可以指定它的分区
- 有一个计算函数:RDD以partition为基本单位,每个RDD都会实现一个函数对具体的partition进行计算。
- 有依赖:每一个RDD都会依赖于其它的RDD,RDD的每次转换都会生成一个新的RDD,当有分区或者数据丢失的时候,就可以根据RDD的依赖关系去重新计算丢失的存取数据,而不是对所有的RDD进行重新的计算。
- 实现了两种类型的分区函数:基于hash的和基于range的两种分区器
- 每个分区都会有一个优先的位置列表:会存储每个partition的优先位置,比如对于一个hdfs的文件就会存储每个partition块的位置。
RDD算子
RDD提供了很多的算子,就是RDD结构的成员函数。
- Transfrom算子:该算子会生成一个新的RDD,比如map、filter等
- Action算子:触发jop提交
RDD依赖类别
- 窄依赖:父RDD的每个partition至多对应一个子RDD分区
- 宽依赖:父RDD的每个partition都可能对应多个子RDD分区,会产生shuffle
内存管理
Executor主要有两类内存:Storage、Execution,两类内存被UnifiedMemoryManager进行统一的管理,这两类内存是动态调整,可以互相借用。
当Storage空闲,Execution可以借用Storage的内存使用,Execution使用的内存不能被Storage驱逐。当Execution空闲,Storage可以借用Execution的内存使用,当Execution需要内存时,可以驱逐被Storage借用的内存。
什么是shuffle
map和reduce之间数据处理的过程,也就是数据重新分发的过程成为shuffle。
SparkSQL
图源:青训营课堂
Catalyst:利用RBO、CBO对执行过程中的执行计划进行处理优化。
DataFrame:以RDD为基础的分布式数据集,更像是传统数据库的二维表格,不但可以记录数据,也可以记录数据的结构信息,与Hive比较类似。
AQE(自适应查询规划):会基于运行时的统计数据对正在运行的任务进行优化,这种边执行边优化的方式可以提高SQL执行的效率。
Runtime Filter:在join中生成filter算子,用该算子进行优化,将该filter尽量的下推到靠近数据源的地方,可以减少大表的扫描,提升查询性能。
Codegen:从Runtime优化中局部优化提高CPU利用率的角度出发,生成程序代码的技术或系统。