数据结构
RDD
- 弹性分布式数据集。
Resilient Distributed Datasets,意为容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。同时,RDD还提供了一组丰富的操作来操作这些数据。
- RDD的特点
- 它是在集群节点上的不可变的、已分区的集合对象。
- 通过并行转换的方式来创建如(map, filter, join, etc)。
- 失败自动重建。
- 可以控制存储级别(内存、磁盘等)来进行重用。
- 必须是可序列化的。
- 是静态类型的。
- RDD优点
- 编译时类型安全
- 面向对象的编程风格 ,直接通过类名点的方式来操作数据
- RDD缺点
- 序列化和反序列化的性能开销,因为RDD只有数据,没有数据结构,无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化.
- GC的性能开销,频繁的创建和销毁对象, 势必会增加GC。
RDD曾是spark处理数据最核心的基本单元,而spark在1.6推出了新的数据处理对象DataFarme和DataSet。
DataFarme
它在RDD的基础上增加了数据的类型。DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。
- 它针对RDD的弱点做了如下优化
- 序列化与反序列化的性能开销,这个不用说,因为有了数据结构,所以节省了这一块。具体上,DataFrame引入了schema : RDD每一行的数据, 结构都是一样的. 这个结构就存储在schema中. spark通过schame就能够读懂数据, 因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了.
- GC的性能开销,DataFrame引入了off-heap: 意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中, 当要操作数据时, 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作.
缺点:没有了RDD类型安全和面向对象的优点。
Dataset
结合了RDD和DataFrame的优点。它同时具备了RDD的类型安全和面向对象优点,同时也具备了DataFrame的schema和off-heap。同时,它引入了新的概念Encoder。能够按需访问,而无需访问整个对象。
总结
- RDD类型安全,面向对象。
- RDD仅有数据没有数据结构,序列化开销大。DataFrame引入schema使其具备了数据结构。同时其生命周期脱离了JVM和频繁的GC回收。因此其不再是字节码,而是二进制,又因为schema,所以操作系统和spark能够快速识别。但DataFrame失去了RDD类型安全面向对象的优点。
- DataSet具体RDD和DataFrame的共同优点。同时能够按字段访问,无需操作整 个对象。
- 就优点和性能来说 RDD<DataFrame<DataSet
组件
imageSpark算子
Transformation变换/转换算子
这种变换并不触发提交作业,完成作业中间过程处理。
Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算。
Action行动算子
这类算子会触发 SparkContext 提交 Job 作业。
Action 算子会触发 Spark 提交作业(Job),并将数据输出 Spark系统。
输入分区与输出分区一对一型
- map算子
- flatMap算子
- mapPartitions算子
- glom算子
输入分区与输出分区多对一型
- union算子
- cartesian算子(笛卡尔积函数)
输入分区与输出分区多对多型
- grouBy算子
输出分区为输入分区子集型
- filter算子
- distinct算子
- subtract算子(去掉交集,不去重)
- sample算子
- takeSample算子
- intersection算子(取子集并去重)
Cache型
- cache算子
- persist算子
cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。
常用算子总览
操作类型 | 函数名 | 作用 | 输入与输出关系 | |
---|---|---|---|---|
转化操作 | map | 参数是函数,函数应用于RDD每一个元素,返回值是新的RDD | 分区一对一 | |
转化操作 | flatMap | 参数是函数,函数应用于RDD每一个元素,将元素数据进行拆分,变成迭代器,返回值是新的RDD | 分区一对一 | |
转化操作 | filter | 参数是函数,函数会过滤掉不符合条件的元素,返回值是新的RDD | 分区一对一 | |
转化操作 | distinct | 没有参数,将RDD里的元素进行去重操作 | 输出分区为输入分区子集 | |
转化操作 | union | 参数是RDD,生成包含两个RDD所有元素的新RDD | 输入分区与输出分区多对一 | |
转化操作 | intersection | 参数是RDD,求出两个RDD的共同元素 | 输出分区为输入分区子集 | |
转化操作 | subtract | 参数是RDD,将原RDD里和参数RDD里相同的元素去掉 | 输出分区为输入分区子集 | |
转化操作 | cartesian | 参数是RDD,求两个RDD的笛卡儿积 | 输入分区与输出分区多对一 | |
行动操作 | collect | 返回RDD所有元素 | 返回RDD所有元素 | |
行动操作 | count | RDD里元素个数 | ||
行动操作 | countByValue | 各元素在RDD中出现次数 | ||
行动操作 | reduce | 并行整合所有RDD数据,例如求和操作 | ||
行动操作 | fold(0)(func) | 和reduce功能一样,不过fold带有初始值 | ||
行动操作 | aggregate(0)(seqOp,combop) | 和reduce功能一样,但是返回的RDD数据类型和原RDD不一样 | ||
行动操作 | foreach(func) | 对RDD每个元素都是使用特定函数 |
网友评论