簡單 解析spark RDD

彈性分佈式數據集  RDD(只讀,可分區)  這個數據集的部分或者全部可以緩存在內存中。

所謂彈性,是指內存不夠時可以與磁盤進行交換。

RDD 作爲數據結構,本質上是一個只讀的分區記錄集合。一個rdd可以包含多個分區,每個分區就是一個數據集片段。

 

寬依賴和窄依賴的區別:narrow dependecies 可以支持同一個cluster node 還是哪個以pipeline形式執行多條命令,如執行了map後可以繼續filter,在失敗恢復的時候只需要重新計算丟失的parent partition即可,而且可以並行的在不同的節點進行重計算。而shuffle dependencies 需要所有的父分區都可用,在失敗恢復的時候牽涉個各級的多個parent partitions。

rdd的操作如上圖兩種,轉換和動作。

rdd的四個核心方法:1 getPartitions   返回的是一系列partitions的集合,即一個partition類型的數組。

2 getDependencies  返回的是依賴關係的一個Seq集合,裏面的Dependency數組中的下劃線是類型的PlaceHolder(佔位符)。

3  Compute 是針對RDD的每個partition進行計算的

4 getPreferredLocations是尋找partition的首選位置

 

通過調用SparkContext的parallelize方法,在一個已經存在的Scala集合上創建的(一個Seq對象)。集合的對象將會被拷貝,創建出一個可以被並行操作的分佈式數據集。

spark-shell運行在集羣上的方法  

下面小部分引用 https://blog.csdn.net/legotime/article/details/51871724  推薦看原文  特別不錯  但有個別分區問題有待驗證

外部讀取參數textFile

/**
   * Read a text file from HDFS, a local file system (available on all nodes), or any
   * Hadoop-supported file system URI, and return it as an RDD of Strings.
   */
  def textFile(
      path: String,
      minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
    assertNotStopped()
    hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
      minPartitions).map(pair => pair._2.toString).setName(path)
  }

分析參數:
path: String 是一個URI,這個URI可以是HDFS、本地文件(全部的節點都可以),或者其他Hadoop支持的文件系統URI返回的是一個字符串類型的RDD,也就是是RDD的內部形式是Iterator[(String)]

minPartitions=  math.min(defaultParallelism, 2) 是指定數據的分區,如果不指定分區,當你的核數大於2的時候,不指定分區數那麼就是 2

當你的數據大於128M時候,Spark是爲每一個塊(block)創建一個分片(Hadoop-2.X之後爲128m一個block)

從本地系統讀取整個文件夾

val path = "file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/licenses/"  //local file
val rdd1 = sc.textFile(path,2)
從本地系統中讀取licenses這個文件夾下的所有文件
這裏特別注意的是,比如這個文件夾下有35個文件,上面分區數設置是2,那麼整個RDD的分區數是35*2?

這是錯誤的,這個RDD的分區數不管你的partition數設置爲多少時,只要license這個文件夾下的這個文件a.txt

(比如有a.txt)沒有超過128m,那麼a.txt就只有一個partition。那麼就是說只要這35個文件其中沒有一個超過

128m,那麼分區數就是 35個

 

對spark輸出結果進行排序(廣告點擊與商品排名)

  def sortByKey(ascending: Boolean = true, numPartitions: Int = self.partitions.length) : RDD[(K, V)] = self.withScope
  {
    val part = new RangePartitioner(numPartitions, self, ascending)
    new ShuffledRDD[K, V, V](self, part)
      .setKeyOrdering(if (ascending) ordering else ordering.reverse)
  }

union操作:

結果

groupByKey :

結果:

join操作實際上就是一個笛卡爾積的操作  

 

下面介紹Action操作:

reduce  

lookup的使用:

結果:

rdd.toDebugString 可以查看lineage關係

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