Spark基本组件与概念

数据结构

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

组件

image

https://blog.csdn.net/lisi1129/article/details/54755215

Spark算子

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每个元素都是使用特定函数

你可能感兴趣的:(Spark基本组件与概念)