1. 程式人生 > >Spark入門(三):RDD概述

Spark入門(三):RDD概述

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時,程式報錯