Spark入门(三):RDD概述

版权声明:转载请标注原文地址 https://blog.csdn.net/soul_code/article/details/77131683

1.RDD概述

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时,程序报错

猜你喜欢

转载自blog.csdn.net/soul_code/article/details/77131683