什么是RDD

RDD是Spark计算的时候操作的数据集,全称是Resilient Distributed Datasets(弹性分布式数据集)。


数据是分布在多台机器上的,为了好处理,将这些分布的数据抽象成一个RDD。这个RDD就是所有数据的代理,操作RDD就相当于操作分布在每台机器上的数据。

而RDD又是由很多分区组成的,操作RDD的时候,对RDD里面的每一个分区进行操作。而这些操作真正的会分发到每台机器上,并且拥有容错机制。一个分区针对一台机器,如果那个机器上的数据过大了,就对对应多个分区。

对RDD的操作分为两种transformation和action:

transformation可以将一个RDD转换为下一个RDD,也是为了方便下一步操作。

action是可以触发任务的,当RDD达到一定的条件以后就可以调用action任务,开始真正的处理。

一下操作就是先将文件transformtion成一个RDD,然后action,这个collect是一个action的算式。将分布在不同机器上的数据通过网络收集过来,并且显示。

//执行该句只是告诉后续的程序,到该路径下读取数据
scala> val rdd1 = sc.textFile("hdfs://slave1.hadoop:9000/spark")
rdd1: org.apache.spark.rdd.RDD[String] = hdfs://slave1.hadoop:9000/spark MapPartitionsRDD[31] at textFile at <console>:24

//action操作,将数据收集过来
scala> rdd1.collect
res8: Array[String] = Array(hello jim, hello wo, hello ni, hello jarry)         

//transformaation操作
scala> val rdd2 = rdd1.map(_.split(" "))
rdd2: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[32] at map at <console>:26


//transformation操作
scala> val rdd3 = rdd1.flatMap(_.split(" "))
rdd3: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[33] at flatMap at <console>:26

//action操作
scala> val reduce = wordAndOne.reduceByKey(_+_).sortBy(_._2,false).saveAsTextFile("hdfs://slave1.hadoop:9000/spark/output")
reduce: Unit = ()

transformation是lazy的,延迟执行,transformtion后的数据只有遇到action的时候才提交到集群上真正的运行。

如何证明transformation是lazy的呢,首先让我们读取hdfs下一个不存在的文件

scala> val rdd4 = sc.textFile("/sp")
rdd4: org.apache.spark.rdd.RDD[String] = /sp MapPartitionsRDD[100] at textFile at <console>:24

哎,发现时可以的,但这个文件是不存在的,为什么会读到呢。因为它就没有真正的去读取,只有执行的action的操作,才会去执行,此时就会报错了。说是文件不存在,所以说transformation是lazy的。

scala> val rdd4 = sc.textFile("/sp").collect
org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://ns/sp
  at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:287)
  at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:229)
  at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315)
  at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:194)
  at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
  at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
  at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
  at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
  at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
  at org.apache.spark.SparkContext.runJob(SparkContext.scala:2087)
  at org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:936)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
  at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
  at org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
  at org.apache.spark.rdd.RDD.collect(RDD.scala:935)
  ... 48 elided

scala> 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章