1. 程式人生 > >大資料乾貨系列(六)--Spark總結

大資料乾貨系列(六)--Spark總結

Spark總結

本質

 Spark是一個分散式的計算框架是下一代的MapReduce,擴充套件了MR的資料處理流程

、mapreduce有什麼問題

1.排程慢啟動map、reduce太耗時

2.計算慢每一步都要儲存中間結果落磁碟

3.API抽象簡單只有mapreduce兩個原語

4.缺乏作業流描述一項任務需要多輪mr

、spark解決了什麼問題

1.最大化利用記憶體cache

2.中間結果放記憶體加速迭代

3.將結果集放記憶體加速後續查詢和處理解決執行慢的問題

select * from table where col1 > 50

rdd.registerastable(cachetable)

SQL:

select col2, max (col3) from cachetable group by col2

select col3, max (col2) from cachetable group by col3

4. 更豐富的API(Transformation類和Actions)

5. 完整作業描述將使用者的整個作業串起來

val file = sc.textFile(hdfs://input)

val counts = file.flatMap(

line => line.split(" "))

.map(word => (word, 1))

.reduceByKey(_ + _)

         counts.saveAsTextFile(hdfs://output)

6. 由於Excutor程序可以執行多個Task執行緒因而實現了多執行緒的操作加快了處理速度

、Spark核心RDD( Resilient Distributed Dataset 彈性分散式資料集模型)

1.四個特徵

    – RDD使使用者能夠顯式將計算結果儲存在記憶體中控制資料的劃分

    – 記錄資料的變換和描述而不是資料本身以保證容錯

    – 懶操作延遲計算,action的時候才操作

    – 瞬時性用時才產生用完就釋放

2.四種構建方法

    – 從共享檔案系統中獲取如從HDFS中讀資料構建

RDD

        • val a = sc.textFile(“/xxx/yyy/file”)

    – 通過現有RDD轉換得到

        • val b = a.map(x => (x, 1))

    – 定義一個scala陣列

        • val c = sc.parallelize(1 to 10, 1)

    – 由一個已經存在的RDD通過持久化操作生成

        • val d = a.persist(), a. saveAsHadoopFile(“/xxx/yyy/zzz”)

3.partition和依賴

    – 每個RDD包含了資料分塊/分割槽(partition)的集合每個partition是不可分割的

    – 每個partition的計算就是一個task,task是排程的基本單位

    – 與父RDD的依賴關係(rddA=>rddB)

    寬依賴: B的每個partition依賴於A的所有partition

             • 比如groupByKey、reduceByKey、join……,A產生B時會先對Ashuffle分桶

    窄依賴: B的每個partition依賴於A的常數個partition

            • 比如map、filter、union……

4.stage和依賴