什么是RDD
一个弹性可复原的分布式数据集,
弹性的意思就是可伸缩,数据可以放在内存当中也可以放在磁盘当中。
可复原就是数据如果在计算过程当中如果丢了,就会recompute,重计算。因为我们在处理数据的时候,每一个分区处理某一部分数据。如果某个任务丢掉了,我们可以让他在其他机器上再起一个任务再处理我们之前的数据。
RDD有五个特点:
一系列的分区组成,每个分区都会有一个函数作用在上面。RDD之间存在依赖关系(可选)如果RDD里面装的是(K,V)有分区器,如果是从HDFS这种文件系统中创建RDD,会有最优位置,是为了数据本地化。
RDD是一个逻辑概念,一个RDD中有多个分区,一个分区在executor上执行的时候,他就是一个迭代器,一个RDD有多个分区一个分区肯定在一台机器上,但是一台机器上可以有多个分区
我们要操作的是分布在多台机器上的数据,而RDD相当于是一个代理对象。对RDD操作其实就是对分区进行操作。就是对每一台机器上的迭代器进行操作。因为迭代器引用着我们要操作的数据。
接下来我们来看一个例子:
val rdd1 = sc.textFile("hdfs://marshal:9000/wordcount/input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://marshal:9000/wordcount/output")
在这里一个小黑点代表一个RDD
TextFile会生成两个RDD
一个是hadoopRDD记录他以后去哪里读。读的是键值对,key是偏移量,value是一行的内容。
这里的map方法将key干掉,只要value并且将value toString这里又返回一个MapPartitionRDD
这里有一个最小分区MinPartitons他默认为2,因为如果是1的话就是单进程了,而我们需要他并行执行。
flatMap生成了MapPartitionRDD,其实是对每个分区的迭代器进行flatMap,
接下来进行map,map又生成了一个MapPartitionRDD:
reduceByKey生成了一个ShuffledRDD:
最后保存的时候还生成了一个RDD,他用NullWritable作为key,用内容作为value写入hdfs