Spark概述
一、什么是RDD
**Spark RDD(
Resilient Distributed Dataset
)是 Spark 中最基本的数据抽象,它代表一个不可变、可分区、元素可以并行计算的数据集合。**
RDD 是 Spark 中数据处理的核心概念,提供了一种高效的分布式数据处理模型。
二、RDD特性
1.基于内存计算(
In-Memory Computation
)
RDD(弹性分布式数据集)基于内存计算的核心思想是将数据加载到内存中以加快处理速度。
相比于传统的磁盘存储(Hadoop),内存(RAM)的读写速度更快,因此在数据处理过程中,RDD通过将数据保存在内存中来提高计算效率。
在RDD的工作机制中,当数据被加载到内存后,可以进行快速的迭代计算,而不需要频繁地访问磁盘,
大大减少了磁盘IO。尤其适用于需要多次访问相同数据的操作,比如机器学习和图计算等任务。
2.惰性计算(
Lazy Evaluation
)
先了解一下RDD中的算子(
operator
)分类:
- 转换算子(Transformations):这些算子用于创建新的RDD。转换算子是惰性计算的,如
map
、filter
、flatMap
等。它们定义了如何从现有RDD生成新的RDD,但不会立即执行计算。 - 行动算子(Actions):这些算子触发实际计算,并将结果返回到驱动程序或存储到外部系统中,如
collect
、count
、saveAsTextFile
等。
RDD的惰性计算意味着转换算子不会立即执行,而是将其计算逻辑记录在计算图中。
只有当遇到行动算子时,RDD才会真正计算,并优化整个计算过程。
3.容错保证(
Fault Tolerant
)
RDD(弹性分布式数据集)的容错机制使它能够在节点故障的情况下保持计算结果的正确性和系统的稳定性。
血统信息(Lineage Information)
- RDD通过记录其血统信息来实现容错。
- 血统信息是指RDD如何从其他RDD转换而来的记录。每个RDD都维护了一个转换操作的记录,包括它的父RDD及变换操作。
- 如果某个分区的数据丢失,Spark可以利用血统信息重新计算丢失的部分,而不是重新计算整个RDD。
容错机制的优点
- 高效恢复:通过重计算丢失的数据,而不是保存数据的副本,Spark避免了大量的数据冗余,提高了存储效率。
- 透明性:用户不需要手动处理数据丢失的问题,Spark的容错机制在后台自动处理。
4.不可变性(
Immutability
)
- 不可变性:RDD一旦创建,它的内容就不能被修改。这意味着对RDD的任何操作都会生成一个新的RDD,而不会改变原始RDD的内容。
优点
- 简化并行计算:- 在并行计算环境中,不可变的数据结构避免了数据竞争和同步问题,因为数据不会被多个任务同时修改。这使得并行计算更为简单和安全。
- 提高容错能力:- 不可变性结合RDD的血统信息,使得恢复丢失的数据变得更为高效。如果某个分区的数据丢失,Spark可以通过重新计算丢失部分的数据,而无需担心数据在重新计算过程中被意外修改。
- 优化计算过程:- 不可变的RDD允许Spark在执行计算时进行各种优化,例如延迟计算和惰性评估。由于数据不变,Spark可以推迟计算直到需要结果时,这样可以减少不必要的计算和中间数据的生成。
- 简化数据流模型:- 在RDD的不可变模型中,数据流是单向的,从输入RDD到输出RDD的计算过程不涉及中间状态的修改。这使得数据流更加清晰和容易理解。
5.分区性(
Partitioning
)
RDD 的分区是指将数据集按照一定的规则分割成若干个部分,每个部分称为一个分区,这些分区可以分布在集群中的不同节点上进行并行处理。
- 分区(Partition):在RDD中,数据被分割成多个小块,这些小块称为分区。每个分区是RDD的一个子集,并且可以被并行处理。分区是RDD的物理数据存储单元。
- 分区数(Number of Partitions):RDD的分区数决定了数据如何被分配到集群中的计算节点。合适的分区数可以提高计算效率和资源利用率。
分区的创建和控制
- 创建RDD时的分区: - 当你通过创建RDD的操作(如
parallelize
)创建RDD时,可以指定分区数:val rdd = sc.parallelize(data, numPartitions)
numPartitions
是分区的数量。
- 默认分区数:- 如果没有显式指定分区数,Spark会使用默认的分区数。这个默认值通常基于集群的配置,例如每个节点的核心数。
- 调整分区数:- 你可以使用转换操作来调整RDD的分区数,例如
repartition
和coalesce
: -repartition(numPartitions)
:均匀地重新分区,并可能会导致数据的全量 shuffle。-coalesce(numPartitions)
:减少分区数,适用于减少分区而不进行 shuffle,通常在数据量减少时使用。
分区的类型
- 范围分区(Range Partitioning):- 根据数据的值范围来划分分区。例如,对一个按键排序的数据集进行范围分区,可以保证每个分区包含一个特定范围的键值。- 分区内无序,分区间有序。- 范围查询(如 between 操作)特别高效,因为 Spark 可以直接跳到相关分区,而不需要扫描整个数据集。
- 哈希分区(Hash Partitioning):- 使用哈希函数将数据映射到不同的分区。每个分区包含哈希值相同的数据。例如,对一个键进行哈希分区,确保具有相同键的数据分配到相同的分区中。- 数据的局部性较好,相同键的数据始终位于同一分区,减少了网络IO。- 但是哈希分区的分布可能导致某些分区过于繁忙,而其他分区则可能闲置
- 并行度:分区数直接影响并行度。更多的分区可以提高并行度,但分区数过多也会增加任务调度的开销。
- 负载均衡:合理的分区策略可以帮助均衡计算负载,避免某些节点过载。
- 数据局部性:良好的分区策略可以提高数据局部性,减少网络传输开销。
6.可持久性(
Persistence
)
RDD(可持久性(Persistence)是指将 RDD 的计算结果存储在内存或磁盘中,以避免在后续操作中重新计算。
- 存储级别:可以选择不同的存储级别,例 -
MEMORY_ONLY
:仅在内存中存储。(默认)-MEMORY_AND_DISK
:在内存中存储,不够时写入磁盘。-DISK_ONLY
:仅在磁盘中存储。- tips:(+SER代表序列化)
- 操作: -
persist()
方法:用于指定存储级别并持久化 RDD。-unpersist()
方法:用于移除 RDD 的缓存,释放存储资源。
7.粗粒度操作(Coarse-Grained Operations)
- RDD 的 粗粒度操作(Coarse-Grained Operations) 指的是那些在 RDD 层面上进行的大规模操作,这些操作对数据集的所有元素进行一次性的处理。
- 粗粒度操作通常是对整个数据集进行的操作,而不是针对数据集中单个元素的细粒度处理。
- 这些操作通常在整个 RDD 上执行,而不是单独的元素。每个操作会影响到整个数据集的分区。
- Tips:对RDD操作 就是 对RDD的每一个分区的元素操作,是粗粒度的操作。
好累,又整理很久,一键三连吧列位~😂
版权归原作者 喻师傅 所有, 如有侵权,请联系我们删除。