spark之RDD基础简介

RDD简介

RDD全称为弹性分布式数据集(Resilient Distributed Dataset),是spark的编程模型,是MapReduce模型的扩展和延伸,可以在并行计算阶段高效地进行数据共享。

RDD基础

RDD类型

RDD主要分为以下四种类型:

  • 创建操作:用于RDD创建工作。主要有两种方法:来自于内存集合和外部存储系统;通过转换操作生成的RDD。
  • 转换操作:将RDD通过一定的操作变换成新的RDD。
  • 控制操作:进行RDD持久化。让RDD根据不同的存储策略保存在内存或者磁盘中。
  • 行动操作:能够触发spark运行的操作。spark中行动操作分为两类:一类的操作结果变成scala集合或变量,另一类的操作是将RDD保存到外部文件系统或者数据库中。

创建RDD

  • 并行化集合创建操作

    使用SparkContextparallelize方法,在一个已经存在的scala集合上创建。集合的对象将会被复制,创建出一个可以被并行操作的分布式数据集。

  • 外部存储创建操作

    spark可以将任何Hadoop所支持的存储资源转换成RDD。

RDD依赖关系

主要分为窄依赖和宽依赖:

  • 窄依赖:每个父RDD的分区都至多被一个子RDD的分区使用。
  • 宽依赖:多个子RDD的分区依赖一个父RDD的分区。

    读取文件

    wordmap的依赖关系是OneToOneDependency,属于窄依赖

    使用reduceByKey操作对单词进行计数

    wordreduce的依赖关系是ShuffleDependency,属于宽依赖

RDD的分区数

RDD划分很多的分区(partition)分布到集群的节点中,分区的多少涉及对这个RDD进行并行计算的粒度。分区是个逻辑概念。用户可以在读取文件时指定分区数目。默认数值是改程序所分配到的CPU核数,如果从HDFS进行创建,则默认为文件的副本数。

RDD分区计算(Iterator

spark中RDD计算是以分区为单位的,而且计算函数都是对迭代器复合,不需要保存每次计算的结果。分区计算一般使用mapPartitions等操作进行。

1
def mapPartitions[U: ClassTag](f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]

f为输入函数,处理每个分区里面的内容。

函数iterfunc把分区中一个元素和他的下个元素组成一个Turple

RDD分区函数(Partitioner

spark默认提供两种划分器:哈希分区划分器(HashPartitioner)和范围分区划分器(RangePartitioner),且Partitioner只存在(K, V)类型的RDD中,对于非(K, V)类型的RDD,其Partitioner值为None

参数4是group_rdd最终拥有的分区数

RDD基本转换操作

  • map
  • flatMap
  • distinct
  • coalesce:对RDD重新分区。第一个参数是重分区的数目,第二个参数为是否进行shuffle,默认为false。如果重分区的数目大于原分区,则需要设为True
  • repartition:是coalesce第二个参数为True时的实现。
  • randomSplit

  • union:结果不去重。
  • mapPartitions
  • mapPartitionsWithIndex
  • zip:将两个同样分区RDD进行合并,键值分别对照组合。分区不同的两个RDD会报异常。

RDD键值转换操作

  • reduceByKey:将RDD[K, V]中每个K对应的V根据映射函数进行计算。

  • reduceByKeyLocally:同reduceByKey,不过是将结果映射到一个Map[K, V]中。
  • joinfullOuterJoinleftOuterJoinrightOuterJoin

    join 内连接操作:

    leftOuterJoin 左连接操作:

    rightOuterJoin 右连接操作:

RDD行动操作

  • aggregate

    进行aggregate操作:
    先在每个分区中迭代执行 (x:Int, y:Int) => x + y,并且zeroValue为1,即分区1中为1+5+4+3+2+1=16,分区2中为1+10+9+8+7+6=41
    再将两个分区进行合并,1+16+41=58

总结

本文主要对RDD的四种操作进行了简单汇总,后续将对一些操作函数进行扩充完善。