这是我参加「第四届青训营 」笔记创作活动的第5天
一. Spark介绍
spark一种通用的统一的计算引擎(General Unified Engine)
特点:
- 统一引擎,支持多种分布式场景
- 多语言支持
- 可读写丰富数据源
- 丰富灵活的API/算子
- 支持K8S/YARN/Mesos资源调度
二.SparkCore
2.1 什么是RDD
2.1.1 RDD定义
RDD是Spark中的数据抽象,意思是弹性分布式数据集。在逻辑上是一个数据集,在物理上则可以分块(partition)分布在不同的机器上并发运行(parallel)。RDD的数据具有不可变性(immutable)。
如图,一个逻辑RDD在物理上分块存储在不同的服务器
2.1.2 如何创建RDD
- 内置RDD
- ShuffleRDD/HadoopRDD/JDBCRDD/KafukaRDD/...
- 自定义RDD
2.1.3 RDD算子
- Transform算子:生成一个新的RDD
- map/filter/flatMap/groupByKey/reduceBuKey/...
- Action算子:触发job提交
- collet/count/take/saveAsTextFile/...
在Spark程序中,首先要读取或创建RDD, 然后对数据进行一系列的变换操作(Transform),保存中间结果(Cache),最后对变换结果进行处理(Action)
2.1.4 RDD依赖
RDD依赖:描述父子RDD之间的依赖关系
- 窄依赖:父RDD的每个partition至多对应一个子RDD分区
- 宽依赖:父RDD的每个partition都可能对应多个子RDD分区
2.1.5 RDD执行流程
RDD在Spark]中运行,主要分为以下三步:
- 创建RDD对象
- DAG scheduler模块介入运算,计算RDD之间的依赖关系,形成DAG
- 每一个Job被划分为多个stage,划分stage的一个主要依据是当前计算因子的输入是否确定,如果确定将其分在同一个stage,避免多个stage之间的消息传递开销
执行过程:
- 用户程序创建SparkContext后,它会连接到集群资源管理器(Cluster Manager),集群资源管理器会为用户分配计算资源,并启动Executor
- Driver将计算程序划分为不同的执行阶段和多个task,之后将task发送给Executor
- Executor负责执行task,并将执行状态汇报给Driver,同时也会将当前节点资源的使用情况汇报给集群资源管理器
2.2 内存管理
- Executor的内存主要有两类:Storge,Execution
- Unified Memory Manager统一管理Execution/Storge的内存
- Unified Memory Manager统一管理多个并发Task的内存分配
- Unified Memory Manager统一管理多个并发Task的内存分配
- Storge和Execution的内存的使用是动态调整的,可以互相借用