RDD

一、什么是RDD

RDD - Resilient Distributed Dataset, 弹性分布式数据集

让开发者大大降低开发分布式应用程序的门槛以及提高执行效率

RDD是spark中的基本抽象,它表示不可变的(val,意味着RDD一旦产生,就不可以被改变)、元素可拆分成分区的(Block、InputSplit)、可以被操作以并行方式的。

Resilient - 弹性:代表spark在分布式计算时可以容错(比如某节点宕机、某一部分数据丢失、它可以通过RDD的一些机制来进行修复),准确地说弹性是体现在计算方面的;

Distributed - 分布式:数据可能是跨节点、存储在不同的节点之上;提升执行效率

Dataset - 数据集:spark中数据集可以以读一个文件的方式创建,也可以通过编程的方式创建,还可以通过数据集的转换来得到一个新的数据集。数据集可以被拆分成很多个分区来存储和计算(可以理解为HDFS中的block,或者mapreduce里面的InputSplit,一个文件就是一个dataset)。

RDDA:(1,2,3,4,5,6,7,8,9) 

拆分成3个分区:hadoop000:Partition1:(1,2,3)

hadoop001:Partition2:(4,5,6)

hadoop003:Partition3:(7,8,9)

对RDDA做一个+1 的操作: operated + 1,即对所有的分区都做一个+1的操作。

二、RDD的定义

    1)抽象类  不能直接使用的 ,RDD必然是有子类实现的,使用的时候直接用子类即可

    2)serializable  可序列化(分布式集群性能)

    3)Logging 日志  在Spark1.6里面可以直接使用,在2.0版本里被移走了,不能直接使用(想用可以自己写)

    4)T 泛型 支持各种类型

    5)SparkContext   

    6)@transient        修饰符

三、RDD五大特新

    1)A list of partitions (必选项)        RDD的基本构成是以partition构成的

    2)A function for computing each split    split即partition(必选项)

    3)A list of dependencies on other RDDs (必选项)

        RDDA(加载来的)=>RDDB(B依赖于A)=>RDDC(C依赖于B)=>RDDD(D依赖于C)

        RDD和RDD之间有依赖关系

    当RDDA的某一个partition挂掉了,把数据重新加载一下即可

    当RDDC的某一个partition挂掉了,从RDDB里面的partition做一个转换就过来了

    上面的过程体现了RDD的弹性

    4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned 默认哈希)(可选项)

    5)Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)(可选项)

四、RDD五大特点和源码中的对应关系

    def compute(split: Partition, context: TaskContext): Iterator[T] ==> 特点2  partition

    protected def getPartitions: Array[Partition] ==> 特点1

    protected def getDependencies: Seq[Dependency[_]] = deps ==> 特点3

    protected def getPreferredLocations(split: Partition): Seq[String] = Nil ==> 特点5

    @transient val partitioner: Option[Partitioner] = None ==> 特点4

五、如何创建RDD

Spark中创建RDD的创建方式大概可以分为两种

1、parallelizing an existing collection in your driver program

        通过集合的操作来创建RDD

并行化集合是通过调用驱动程序中现有集合上的SparkContext的parallelize方法创建的

        val  data=Array(1,2,3,4,5)

        val  distData=sc.parallelize(data)

      // distData.collect  ============> action操作 web界面才有jobs

        val  distData=sc.parallelize(data,5)

        distData.collect

        第二个参数是设置有多少个partitions,在Spark中有多少个partition则就会有多少个task

2、 referencing a dataset in an external storage system, such as a shared filesystem, HDFS, HBase, or any data source offering a Hadoop InputFormat.

        外部存储系统中应用数据集,共享的文件系统,HDFS,HBase,或者任何支撑Hadoop InputFormat.(95%采用这种方式)

textFile:读一个text文件从HDFS或者本地文件系统(确保所有节点都有该文件),或者hadoop支持的URI,返回一个String类型的RDD

    val distFile = sc.textFile("file:///home/hadoop/data/ruoze-input.txt")

六、读取Spark文件的注意事项

1、如果使用一个路径在本地文件系统上,该文件必须能够访问到,以相同的路径在work nodes,要么拷贝文件到所有的节点,或者使用一个挂在的共享文件系统(hdfs等)

2、Spark的所有基于文件的输入法,包括textFile,都支持在目录、压缩文件和通配符上运行。

你可能感兴趣的:(RDD)