RDD简介

RDD - 弹性分布式数据集 (Resilient Distributed DataSet)

什么是RDD

  • RDD是一个基本的抽象,操作RDD就像操作一个本地集合一样,降低了编程的复杂度;
  • 操作RDD,其实是对每个分区进行操作,分区会生成Task,Task会调度到Executor上执行相关的计算逻辑,进而对数据进操作

与本地集合区别:
1)RDD里面存入的是描述信息(从哪里读数据、以后对数据如何计算),不存真正要计算的数据,而是记录了RDD的转换关系(调用了什么方法,传入什么函数)
2)RDD的算子分为两类,一类是Transformation(lazy),一类是Action(触发任务执行)
RDD的Transformation的特点

  • lazy(即并不立即执行)
  • 生成新的RDD

区别在于scala集合存储的是真正的数据、执行方法后立刻返回结果

RDD是弹性分布式数据集,弹性有可复原的意思,因为RDD和RDD之间存在依赖关系,记录了转换关系,即使数据丢了,也可以根据转换关系重新计算。

RDD创建方式

3种方式:

  1. 通过外部的存储系统创建RDD
val sc = new SparkContext(conf)
val lines: RDD[String] = sc.textFile("hdfs://hadoop100:9000/wc")
  1. 将Driver的Scala集合通过并行化的方式编程RDD(试验、测验)
val list = List("a","b","c')
val rdd = sc.parallelize(list)
  1. 调用一个已经存在了的RDD的Transformation,会生成一个新的RDD
val rdd1 = rdd.map((_,1))

RDD的分区

RDD简介_第1张图片
RDD分区的数量取决于哪些因素?

  1. 如果是将Driver端的Scala集合并行化创建RDD,并且没有指定RDD的分区,RDD的分区就是为该application分配的中的和核数
  2. 如果是从hdfs中读取数据创建RDD,并且设置了最新分区数量是1,那么RDD的分区数即是输入切片的数据;
    如果不设置最小分区的数量,即spark调用textFile时会默认传入2,那么RDD的分区数量会大于等于输入切片的数量

什么时候RDD的分区数量会大于输入切片的数量?(涉及源码)
简单来说:假设在HDFS中有三个文件(3个输入切片),其中两个文件大小差不多(例如10kb),而第三个文件的大小与前两个文件相差很大(例如1000Kb),这时如果不设置最小分区的数量,即spark调用textFile时会默认传入2,此时会再次将大文件切分成两个小文件(如果这两个小文件还不满足条件还会继续切分),此时saveAsTextFile()会有4个文件。

RDD特点

  • A list of partitions (一系列分区,分区有编号,有顺序的,一个分区引用着存储系统中数据的一个切片)
  • A function for computing each split (每一个切片都会有一个函数作用在上面用于对数据进行处理)
  • A list of dependencies on other RDDs (RDD和RDD之间存在依赖关系)
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
    (可选,key value类型的RDD才有RDD[(K,V)])如果是kv类型的RDD,会一个分区器,默认是hash-partitioned
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
    (可选,如果是从HDFS中读取数据,会得到数据的最优位置(向Namenode请求元数据))

你可能感兴趣的:(大数据,大数据)