Spark 对数据的核心抽象---弹性分布式数据集(Resilient Distributed Dataset,简
称 RDD)
1.1 不可变
RDD是一个不可变的分布式对象集合,一旦创建便不能修改。
1.2 分区
每个RDD都可被分为多个分区,分布在不同的节点机器之上
1.3 转换(transformation)
转化操作会由一个 RDD 生成一个新的 RDD,从已有的RDD派生出新的RDD,Spark会使用谱系图来记录不同RDD之间的依赖关系。Spark需要用这些信息来按需计算每个RDD,也可以依赖谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据。
1.4 行动(action)
行动操作会对 RDD 计算出一个结果,并把结果返回到驱动器程序中,或把结
果存储到外部存储系统中
1.5 惰性计算
当创建RDD或者从RDD派生RDD,spark都不会执行真正的计算,只有在第一次行动(action)执行时,才会执行真正的计算
val input = sc.textFile("derby.log") //此处并没有真正的去读取文件
val count= input.count() // 程序运行到这里才会去读取文件,并执行计算
代码验证
scala> val rdd =sc.textFile("hdfs://master:9000/derby.log")
rdd: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/derby.log MapPartitionsRDD[1] at textFile at <console>:24
scala> rdd.count
org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://master:9000/derby.log
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:202)
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:1958)
at org.apache.spark.rdd.RDD.count(RDD.scala:1157)
... 48 elided
scala>
val rdd =sc.textFile("hdfs://master:9000/derby.log")使用一个不存在的路径创建一个RDD,程序并没有报错,说明此时spark没有去读取文件。当调用count时,程序报错