RDD是什么
RDD, 全称为弹性分布式数据集(Resilient Distributed Datasets), 是一个容错的, 并行的数据结构, 可以让用户显式地将数据存储到磁盘和内存中, 并能控制数据的分区.
同时, RDD 还提供了一组丰富的操作来操作这些数据. 在这些操作中, 诸如 map, flatMap, filter 等转换操作实现了 Monad 模式, 很好地契合了 Scala 的集合操作. 除此之外, RDD 还提供了诸如 join, groupBy, reduceByKey 等更为方便的操作, 以支持常见的数据运算.
通常来讲, 针对数据处理有几种常见模型, 包括: Iterative Algorithms, Relational Queries, MapReduce, Stream Processing. 例如 Hadoop MapReduce 采用了 MapReduce 模型, Storm 则采用了 Stream Processing 模型. RDD 混合了这四种模型, 使得 Spark 可以应用于各种大数据处理场景.
RDD 作为数据结构, 本质上是一个只读的分区记录集合. 一个 RDD 可以包含多个分区, 每个分区就是一个 DataSet 片段.
RDD 之间可以相互依赖, 如果 RDD 的每个分区最多只能被一个子 RDD 的一个分区使用,则称之为窄依赖, 若被多个子 RDD 的分区依赖,则称之为宽依赖. 不同的操作依据其特性, 可能会产生不同的依赖. 例如 map 操作会产生窄依赖, 而 join 操作则产生宽依赖.
RDD 特点
- RDD 是一个编程模型
- RDD 允许用户显式的指定数据存放在内存或者磁盘
- RDD 是分布式的, 用户可以控制 RDD 的分区
- RDD 是一个编程模型
- RDD 提供了丰富的操作
- RDD 提供了 map, flatMap, filter 等操作符, 用以实现 Monad 模式
- RDD 提供了 reduceByKey, groupByKey 等操作符, 用以操作 Key-Value 型数据
- RDD 提供了 max, min, mean 等操作符, 用以操作数字型的数据
- RDD 是混合型的编程模型, 可以支持迭代计算, 关系查询, MapReduce, 流计算
- RDD 是只读的
- RDD 之间有依赖关系, 根据执行操作的操作符的不同, 依赖关系可以分为宽依赖和窄依赖
RDD 分区
程序从结构上可以用上图表示, 分为两个大部分
-
存储
文件如果存放在 HDFS 上, 是分块的, 类似上图所示, 这个
wordcount.txt
分了三块 -
计算
Spark 不止可以读取 HDFS, Spark 还可以读取很多其它的数据集, Spark 可以从数