spark源码阅读01-核心类的属性和方法

SparkContext

SparkContext是Apache Spark应用程序的核心入口点,它负责初始化Spark环境,并且提供了与集群交互的接口。以下是SparkContext的一些重要属性和方法:

属性

_conf: SparkConf对象,包含了Spark应用程序的配置信息。
_applicationId: Spark应用程序的唯一标识符。
sparkUser: 执行Spark应用程序的用户。
_env: 包含环境变量的Map。
_jars: 已加载的JAR文件列表。
_taskScheduler: 当前的TaskScheduler实例,用于调度任务。
_listenerBus: 事件监听总线,用于发布和订阅事件。
_resourceProfileManager: 资源配置管理器,用于管理资源需求和约束。

方法

defaultParallelism: 默认并行度,用于未显式设置并行度的RDD操作。
defaultMinPartitions: 默认的最小分区数,用于coalesce和repartition操作。
parallelize: 将本地集合转换成分布式RDD。
textFile: 从HDFS或其他支持的文件系统读取文本文件并返回RDD。
binaryFiles: 读取二进制文件并返回文件路径和内容的RDD。
binaryRecords: 读取二进制记录并解析为RDD。
wholeTextFiles: 读取整个文件内容并返回文件名和内容的RDD。
range: 创建一个表示整数范围的RDD。
accumulator: 创建一个累加器变量。
broadcast: 创建一个广播变量。
addJar: 添加一个JAR文件到工作节点上。
addPyFile: 添加一个Python文件到工作节点上。
stop: 停止SparkContext并释放资源。
cancelJobGroup: 取消属于特定组的所有任务。
setCheckpointDir: 设置检查点目录。
clearCheckPointDir: 清除检查点目录。
getLocalProperty: 获取本地属性值。
getConf: 获取配置项的值。
runJob: 运行一个任务并收集结果。
runTask: 在工作节点上运行一个任务。
runJobSet: 运行一组任务。
addFile: 添加一个文件到工作节点上。
getExecutorMemoryStatus: 获取执行器内存状态。
getExecutorMemoryInfo: 获取执行器内存信息。
statusTracker: 返回StatusTracker实例,用于监控作业状态。
这些属性和方法提供了创建、配置和控制Spark应用程序的基本功能。在实际开发中,开发者会频繁使用SparkContext来创建RDD、执行计算任务以及管理集群资源。

SparkEnv

SparkEnv的主要作用是提供和协调Spark应用程序运行所需的各种服务,确保这些服务在Driver端和Executor端正确初始化和可用。它为Spark应用程序提供了统一的接口来访问底层的分布式计算资源和服务。

属性

securityManager: 安全管理器,用于处理Spark应用程序的安全策略。
taskScheduler: 任务调度器,负责调度和执行任务。
blockManager: 块管理器,用于管理在Executor上的数据缓存和存储。
rpcEnv: RPC环境,用于实现节点间的远程过程调用。
listenerBus: 事件监听总线,用于发布和订阅事件,如任务开始、结束等。
outputCommitCoordinator: 输出提交协调器,用于管理输出数据的提交流程。
executorPluginManager: Executor插件管理器,用于管理扩展Spark功能的插件。
conf: Spark配置,用于访问Spark应用程序的配置信息。
metricsSystem: 度量系统,用于收集和报告性能指标。

方法

initialize: 初始化SparkEnv,确保所有必要的服务都被启动。
stop: 停止SparkEnv,释放所有相关资源。
blockManager: 返回当前的BlockManager实例。
rpcEnv: 返回当前的RpcEnv实例。
securityManager: 返回当前的SecurityManager实例。
taskScheduler: 返回当前的TaskScheduler实例。
outputCommitCoordinator: 返回当前的OutputCommitCoordinator实例。
listenerBus: 返回当前的ListenerBus实例。
SparkEnv的设计是为了确保Driver端和Executor端能够共享相同的环境配置和服务,同时它也提供了隔离机制,使得每个SparkContext实例拥有独立的运行环境。在Spark的生命周期中,SparkEnv扮演着至关重要的角色,确保了Spark应用程序的高效执行和资源的有效利用。

RDD

RDD (Resilient Distributed Dataset) 是 Apache Spark 中的核心数据结构,它代表了一个不可变的、分布式的对象集合。RDD 提供了一种高度容错的方式来处理大规模数据集,支持并行操作而不需要程序员去管理底层的分布式细节。

RDD 的作用

数据并行处理:RDD 允许数据在集群中并行处理,每个节点处理数据的一个子集,从而加速数据处理速度。
容错性:RDD 具有容错机制,如果数据集的某一部分丢失,Spark 可以重新计算丢失的数据,而不是必须重新读取原始数据。
数据血缘:RDD 记录了数据的转换历史,这称为数据血缘(Lineage)。Spark 利用数据血缘来实现数据的高效恢复。
缓存和持久化:RDD 支持在内存中缓存,这可以显著加快迭代算法的执行速度。

RDD 的五大核心属性

分区(Partitions):RDD 被切分为多个分区,每个分区可以独立地在集群中的一个节点上执行。
计算每个分区所需的函数(Compute Function for Each Partition):定义如何计算每个分区的数据。
依赖关系(Dependencies):RDD 之间的依赖关系,表示数据的转换过程。
首选位置(Preferred Locations):用于存储每个分区的节点,优化数据的本地化处理。
序列化方式(Serializers):用于数据在网络传输和磁盘存储时的序列化和反序列化。

RDD 的主要方法

转换算子(Transformation Operators):这些操作不会立即执行,而是构建一个执行计划,直到遇到行动算子才会触发执行。

map(func):将每个元素传递给函数 func,并返回新的 RDD。
filter(func):返回一个由满足函数 func 的元素组成的 RDD。
flatMap(func):类似于 map,但是每个输入项可以被映射成0个或多个输出项。
union(otherDataset):返回两个 RDD 的并集。
join(otherDataset):执行内连接,返回两个 RDD 中匹配的键值对。
groupByKey():将相同键的所有值组合在一起。
reduceByKey(func):对具有相同键的值进行聚合,使用函数 func 减少值的数量。
sortByKey():按照键排序。
cache() 或 persist():将 RDD 存储在内存中,以备后续重用。
行动算子(Action Operators):这些操作会触发整个 RDD 图的执行,并返回结果给驱动程序。

count():返回 RDD 中元素的数量。
collect():将 RDD 的所有元素收集到驱动程序上。
first():返回 RDD 中的第一个元素。
take(n):返回 RDD 的前 n 个元素。
saveAsTextFile(path):将 RDD 内容保存到 HDFS 或其他支持的文件系统中。
reduce(func):使用函数 func 对 RDD 中的所有元素进行聚合。
这些只是 RDD 中最常用的一些方法,实际上还有许多其他的转换和行动算子可供使用,以满足各种数据处理需求。

1
2
3
4
5
6
7
8
9
10
//该方法只会被调用一次。由子类实现,返回这个RDD的所有partition。
protected def getPartitions: Array[Partition]
//该方法只会被调用一次。计算该RDD和父RDD的依赖关系
protected def getDependencies: Seq[Dependency[_]] = deps
// 对分区进行计算,返回一个可遍历的结果
def compute(split: Partition, context: TaskContext): Iterator[T]
//可选的,指定优先位置,输入参数是split分片,输出结果是一组优先的节点位置
protected def getPreferredLocations(split: Partition): Seq[String] = Nil
//可选的,分区的方法,针对第4点,类似于mapreduce当中的Paritioner接口,控制key分到哪个reduce
@transient val partitioner: Option[Partitioner] = None