Spark Hello World以及RDD簡述

  1. RDD是什麼
    RDD英文單詞全稱爲Resilient Distributed Datase,叫做彈性分佈式數據集,是Spark中最基本的數據抽象。代碼中是一個抽象類,它代表一個不可變、可分區、裏面的元素可並行計算的集合。不可變、可分區和可並行計算下面再詳細敘述。
  2. RDD特點
    (1)分區
    spark可以把讀進來的數據裝進RDD裏面,因爲spark支持集羣方式部署的,spark的Driver會把RDD分割成小的任務給集羣的Executor去執行。
    (2)只讀
    RDD是隻讀的,不能修改的。要想改變RDD中的數據,只能在現有的RDD基礎上創建新的RDD,這個和Java中的String類似。由原來的RDD轉換爲另一個RDD可以通過豐富的算子進行操作。如map,filter,flatMate,reduceByKey等等…RDD的操作算子分爲兩類,一類叫做transformations(轉換算子),它是用來將RDD進行轉化,構建RDD的血緣關係(血緣關係下面會詳細闡述);另一類叫做actions(行動ing算子),它是用來觸發RDD的計算,得到RDD的相關計算結果或者將RDD保存的文件系統中。
    (3)依賴
    spark程序處理數據的流程就是通過對RDD的一系列操作最後達到處理數據的目的。上面提到因爲RDD不能修改,只能通過生成新的RDD來對RDD進行操作,那麼新的RDD就依賴舊的RDD。爲了更方便理解,以下以spark的hello world爲例進行說明:
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object WorldCount {
    def main(args: Array[String]): Unit = {
        //1.創建SparkConf對象,並指定local模式和這個Spark應用程序的名稱未WorldCount
        val conf = new SparkConf().setMaster("local").setAppName("WorldCount")

        //2.創建SparkContext對象
        val sc = new SparkContext(conf)

        //3.讀入文件
        //打包到集羣去運行的話默認會去當前部署環境中查找,例如是yarn部署模式的話會去yarn中查找,若要查找本機的文件則需file://+文件路徑
        val lines: RDD[String] = sc.textFile("C:\\Users\\ASUS\\IdeaProjects\\Spark\\src\\main\\resources\\input.txt")

        //4.數據扁平化,把數據分割成一個個的單詞
        val words: RDD[String] = lines.flatMap(_.split(" "))

        //5.轉換數據結構,把數據轉換成元組形式(key, 1)
        val wordToOne: RDD[(String, Int)] = words.map( (_, 1) )

        //6.聚合,把key相同的value相加
        val wordToSum: RDD[(String, Int)] = wordToOne.reduceByKey(_+_)

        //7.將數據採集後輸出到控制檯
        val result: Array[(String, Int)] = wordToSum.collect()
        result.foreach(println)

    }
}

代碼流程圖如下:
在這裏插入圖片描述

代碼中的第三步起生成RDD,經過轉換生成第四步的RDD,又經過轉換生成第五步的RDD,以此類推…通過這樣的依賴關係可以溯源。依賴包括兩種,一種是窄依賴,RDDs之間分區是一一對應的,另一種是寬依賴,下游RDD的每個分區與上游RDD(也稱之爲父RDD)的每個分區都有關,是多對多的關係。

在這裏插入圖片描述

(4)緩存
如果在應用程序中多次使用同一個RDD,可以將該RDD緩存起來,該RDD只有在第一次計算的時候會根據血緣關係得到分區的數據,在後續其他地方用到該RDD的時候,會直接從緩存處取而不用再根據血緣關係計算,這樣就加速後期的重用。如下圖所示,RDD-1經過一系列的轉換後得到RDD-n並保存到hdfs,RDD-1在這一過程中會有個中間結果,如果將其緩存到內存,那麼在隨後的RDD-1轉換到RDD-m這一過程中,就不會計算其之前的RDD-0了。

(5)CheckPoint
雖然RDD的血緣關係天然地可以實現容錯,當RDD的某個分區數據失敗或丟失,可以通過血緣關係重建。但是對於長時間迭代型應用來說,隨着迭代的進行,RDDs之間的血緣關係會越來越長,一旦在後續迭代過程中出錯,則需要通過非常長的血緣關係去重建,勢必影響性能。爲此,RDD支持checkpoint將數據保存到持久化的存儲中,這樣就可以切斷之前的血緣關係,因爲checkpoint後的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數據。

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