大資料乾貨系列(六)--Spark總結
Spark總結
一、本質
Spark是一個分散式的計算框架,是下一代的MapReduce,擴充套件了MR的資料處理流程
二、mapreduce有什麼問題
1.排程慢,啟動map、reduce太耗時
2.計算慢,每一步都要儲存中間結果落磁碟
3.API抽象簡單,只有map和reduce兩個原語
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中讀資料構建
• 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時會先對A做shuffle分桶
窄依賴: B的每個partition依賴於A的常數個partition
• 比如map、filter、union……
4.stage和依賴