【Spark | RDD】架构及算子的基本认识

Spark架构

运行环境

在这里插入图片描述

在这里插入图片描述

配置高可用(HA)

所谓的高可用是因为当前集群中的 Master 节点只有一个,所以会存在单点故障问题。所以为了解决单点故障问题,需要在集群中配置多个 Master 节点,一旦处于活动状态的 Master发生故障时,由备用 Master 提供服务,保证作业可以继续执行。这里的高可用一般采用
Zookeeper 设置。
在这里插入图片描述

运行架构

运行架构

在这里插入图片描述

核心组件

Driver

Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。
Driver 在 Spark 作业执行时主要负责:

  • 将用户程序转化为作业(job)
  • 在 Executor 之间调度任务(task)
  • 跟踪 Executor 的执行情况
  • 通过 UI 展示查询运行情况
Executor

Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。
Executor 有两个核心功能:

  • 负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程
  • 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
Master & Worker

Spark 集群的独立部署环境中,不需要依赖其他的资源调度框架,自身就实现了资源调度的功能,所以环境中还有其他两个核心组件:Master 和 Worker,这里的 Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于 Yarn 环境中的 RM, 而
Worker 呢,也是进程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算,类似于 Yarn 环境中 NM。

ApplicationMaster

Hadoop 用户向 YARN 集群提交应用程序时,提交程序中应该包含 ApplicationMaster,用于向资源调度器申请执行任务的资源容器 Container,运行用户自己的程序任务 job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况。
说的简单点就是,ResourceManager(资源)和 Driver(计算)之间的解耦合靠的就是ApplicationMaster。

执行原理

在这里插入图片描述
在这里插入图片描述

RDD 转换算子

单Value型

map、mapPartitions、mapPartitionsWithIndex

Map 算子是分区内一个数据一个数据的执行,类似于串行操作。而 mapPartitions 算子是以分区为单位进行批处理操作。

groupBy分组

filter过滤

sample抽取

distinct去重

coalesce、repartition缩减分区数量

repartition操作内部其实执行的是 coalesce 操作,参数 shuffle 的默认值为 true

sortBy排序

双 Value 类型

intersection求交集

subtract求差集

zip以键值对的形式进行合并

Key - Value 类型

partitionBy

将数据按照指定 Partitioner 重新进行分区

reduceByKey

数据按照相同的 Key 对 Value 进行聚合

groupByKey

将数据源的数据根据 key 对 value 进行分组

aggregateByKey

将数据根据不同的规则进行分区内计算和分区间计算

foldByKey

当分区内计算规则和分区间计算规则相同时,aggregateByKey 就可以简化为 foldByKey

combineByKey

最通用的对 key-value 型 rdd 进行聚集操作的聚集函数(aggregation function)

sortByKey

在一个(K,V)的 RDD 上调用,K 必须实现 Ordered 接口(特质),返回一个按照 key 进行排序

join

在类型为(K,V)和(K,W)的 RDD 上调用,返回一个相同 key 对应的所有元素连接在一起的(K,(V,W))的 RDD

leftOuterJoin 类似于 SQL 语句的左外连接

cogroup

在类型为(K,V)和(K,W)的 RDD 上调用,返回一个(K,(Iterable,Iterable))类型的 RDD

RDD 行动算子

reduce

聚集 RDD 中的所有元素,先聚合分区内数据,再聚合分区间数据

collect

在驱动程序中,以数组 Array 的形式返回数据集的所有元素

count个数

first取第一个元素

take返回一个由 RDD 的前 n 个元素组成的数组

takeOrdered返回该 RDD 排序后的前 n 个元素组成的数组

aggregate

分区的数据通过初始值和分区内的数据进行聚合,然后再和初始值进行分区间的数据聚合

fold 折叠操作,aggregate 的简化版操作

countByKey

save 将数据保存到不同格式的文件中

def saveAsTextFile(path: String): Unit
def saveAsObjectFile(path: String): Unit
def saveAsSequenceFile(
path: String,
codec: Option[Class[_ <: CompressionCodec]] = None): Unit

foreach 分布式遍历 RDD 中的每一个元素,调用指定函数

RDD 序列化

  • 闭包检查
  • 序列化方法和属性
  • Kryo 序列化框架

RDD 依赖关系

  • RDD 血缘关系:将创建 RDD 的一系列 Lineage(血统)记录下来,以便恢复丢失的分区
  • RDD 依赖关系:两个相邻 RDD 之间的关系
  • RDD 窄依赖:窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用。窄依赖我们形象的比喻为独生子女。
  • RDD 宽依赖: 宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,引起 Shuffle,总结:宽依赖我们形象的比喻为多生。
  • RDD 阶段划分:DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,
    不会闭环。
  • RDD 阶段划分源码
  • RDD 任务划分:RDD 任务切分中间分为:Application、Job、Stage 和 Task
  • RDD 任务划分源码

RDD 持久化

  • RDD Cache 缓存
  • RDD CheckPoint 检查点:所谓的检查点其实就是通过将 RDD 中间结果写入磁盘
  • 缓存和检查点区别
    1)Cache 缓存只是将数据保存起来,不切断血缘依赖。Checkpoint 检查点切断血缘依赖。
    2)Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint 的数据通常存
    储在 HDFS 等容错、高可用的文件系统,可靠性高。
    3)建议对 checkpoint()的 RDD 使用 Cache 缓存,这样 checkpoint 的 job 只需从 Cache 缓存
    中读取数据即可,否则需要再从头计算一次 RDD

RDD 分区器

  • Hash 分区:对于给定的 key,计算其 hashCode,并除以分区个数取余
  • Range 分区:将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而且分区间有序

RDD 文件读取与保存

  • text 文件
  • sequence 文件
  • object 对象文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值