一 爲什麼用SPARK
- 先進的大數據分佈式編程和計算框架
- 試圖代替HADOOP(SPARK可以獨立於HADOOP)
- 內存分佈式計算:運行速度快
- 可以用不同語言編程(JAVA,SCALA,R,PYTHON)
- 可以從不同的數據源取數據(HDFS,Cassandra,HBase)
- 實現不同的大數據功能:Spark Core,Spark SQL,Spark Streaming,Spark MLIB 以及GraphX
優點:
- 運行速度快
- 支持迭代式和交互式運行
- 彈性數據集支持數據容錯
- 支持有向無環圖優化
二 SPARK的幾種運行模式
批處理--用於大規模的分佈式數據處理
流方式--Spark流用於傳送和處理實時數據
交互式:用於處理在內存中的大塊數據,較低的延遲性
三 SPARK的數據讀取和存儲
Spark可以從以下系統訪問數據
- hadoop HDFS 以及HIVE,HBASE等生態圈部件
- Amazon S3
- Cassandra, Mongodb
- 其他流工具 如Flume,Kafka所支持的各協議如AVRO另外Spark 可以支持一下文件格式:text,sequencefiles,AVRO,parquet
四 SPARK的主要部件
- SPARK CORE:包含spark的主要基本功能.所有跟RDD有關的API都出自於SPARK CORE
- Spark SQL:spark中用於結構化數據處理的軟件包
- spark streaming:spark中用於處流數據的部件
- MLlib:Spark中用來進行機器學習和數學建模的軟件包
- GraphX:spark中用來進行圖計算(如社交媒體關係)的庫函數
- Cluster Managers:spark中用來管理機羣或節點的軟件平臺
五 SPARK CORE
1.spark生態圈的核心:
負責從HDFS,Amazon s3 和HBase等持久層讀取數據
在YARN和Standalone爲資源管理器調度job完成分佈式計算
包括兩個重要部件
有向無環圖(DAG)的分佈式並行計算框架
容錯分佈式數據RDD
2.部件解析
操作(Operation):作用於RDD的各種操作分爲Transformation(變換)和Action(操作)
DAGScheduler:把對job中的RDD有向無環圖根據依賴關係劃分爲多個stage(階段) 每一個stage是一個TaskSet,他還會根據RDD和stage之間的關係找出開銷最小的調度方法,然後把stage以taskset的形式交給taskscheduler
stage是一個taskset
taskscheduler維護着所有task的運行狀態,重試失敗的task並把合適的task分發給worker中的executor
什麼是job?由多個stage(階段)組成的任務
什麼是階段?根據操作之間的依賴關係由多個算子組成的任務集
3.應用程序
應用程序包括以下兩部分
Driver 初始化SparkContext(spark的入口) executor部分運行完畢後將sparkcontext關閉
Executor負責數據 集合數據集 文件數據集
六 RDD功能介紹
1.RDD兩種類型
並行集合 (並行化集合是通過調用SparkContext的parallelize方法,在一個已經存在的數據集合上 創建的(一個Seq對象)。集合的對象將會被拷貝,創建出一個可以被並行操作的分 布式數據集)
文件系統數據集 (Spark可以將任何Hadoop所支持的存儲資源轉化成RDD,如本地文件(需要 網絡文件系統,所有的節點都必須能訪問到, HDFS, mongodb, HBase, Amazon S3等,Spark支持文本文件、SequenceFiles和任何Hadoop InputFormat格式。)
2.計算方式
- 變換(Transformations) (如:map, filter)的返回值仍然是一個RDD, Transformations操作是Lazy的,也就是說變換隻是一些指令集而並不會去馬 上執行,需要等到有Actions操作的時候纔會真正計算給出結果。Lazy Evaluation
- 操作(Actions) (如:count, collect),Actions操作會返回結果或把RDD數據輸出 到各類系統中。Actions觸發Spark啓動並找到最優的計算途徑。返回值是非 並行化的數據集合比如 PYTHON 中的list
3.RDD的cache和persist
默認情況下當時用action 在RDD上時spark會重新計算刷新RDD,但也可以通過持久化方法cache和persist將RDD放在內存中,這樣第二次使用action在RDD上時,spark講不重新計算刷新RDD
cache和persist級別
dataset2 = dataset1.persist(StorageLevel. MEMORY_ONLY)
dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK)
dataset2 = dataset1.persist(StorageLevel. MEMORY_ONLY_SER)
dataset2 = dataset1.persist(StorageLevel. MEMORY_AND_DISK_SER)
dataset2 = dataset1.persist(StorageLevel. DISK_ONLY)
- 默認選項 ,rdd的(分區)數據直接以java對象的形式存儲於JVM的內存中,如果內存空間不足,某些分區的數據將不會被緩存,需要在使用的時候根據世代信息重新計算
- RDD的數據直接以Java對象的形式存儲於JVM的內存中,如果內存空間不中,某些分區的數據會 被存儲至磁盤,使用的時候從磁盤讀取。
- RDD的數據(Java對象)序列化之後存儲於JVM的內存中(一個分區的數據爲內存中的一個字節 數組),相比於MEMORY_ONLY能夠有效節約內存空間(特別是使用一個快速序列化工具的情況 下),但讀取數據時需要更多的CPU開銷;如果內存空間不足,處理方式與MEMORY_ONLY相同。
- 相比於MEMORY_ONLY_SER,在內存空間不足的情況下,將序列化之後的數據存儲於磁盤。
- 僅僅使用磁盤存儲RDD的數據(未經序列化)。
七 RDD元素變換
1.MAP變換例子
map()參數是函數 函數應用於RDD每一個元素
2.flatMAP()參數是函數,函數應用於RDD每一個元素,將元素進行拆分展平,變成迭代器,返回值是新的RDD
3.filter() 參數是函數,函數會過濾掉不符合條件的元素,返回值是新的RDD
4.連接變換例子
- union() 兩個rdd並集
- intersection()交集
- subtract()差集
- cartesian()乘積
5.count()返回RDD裏元素的數量
6.reduce()並行彙總所有RDD元素
7.countByValue()各元素在RDD中出現的次數
8.aggregate操作例子
aggregate((0,0),seqOp,combOp)
類似於reduce(),但用於返回不同類型。接受三個參數:zeroValue: seqOp操作符的每個分區累積結果的初始值,以及combOp不同分區的組合結果的初始值。
操作符seqOp:用於在分區中累積結果的
操作符combOp:一個聯合運算符,用於合併來自不同分區的結果
9.
- take(n):從rdd中返回n個元素
- top(num):從rdd中返回num元素
- first():返回第一個元素
- collect():返回rdd的所有元素
- foreach(func):將提供的函數應用於每個元素
- takeSample(withRepalcement,num,[seed])
10 KEY-VALUE RDD 變換
- reduceByKey(func):在每一鍵組內進行彙總變換.例如每個班(key)的總分數成績(value)
- groupByKey():將值放到每一相同的鍵組內
- mapValues(func):對每一對rdd鍵值進行函數func值變換而不改變鍵
- sortByKey():得到以鍵排序的rdd
- combineByKey((createCombiner,mergeValue, mergeCombiners,partitioner)
-----------createCombiner():用於產生累加器鍵的初值 比如 lambda x: (x, 1))。這裏x指的 是分數值
-----------mergeValue 每移動一條記錄設置當前的累加器的值。比如: (lambda x, y: (x[0] + y, x[1] + 1)),
-----------mergeCombiners() 在每一鍵組內累加相應的值。比如 (lambda x, y: (x[0] + y[0], x[1] + y[1])))
11.rdd連接變換
- join 內連接
- rightOuterJoin 右連接
- leftOuterJoin 左連接
- cogroup 全連接
- subtractByKey 減連接
12 KEY-VALUE rdd 連接變換
- countByKey() 返回每一鍵組內的記錄數
- collectAsMap() 返回一MAP形式的串行化結果
- lookup(key) 返回某鍵值下的所有值
countByKey()
lookup(key)
13累加器accumulators
累加器通過對一個初始化了的變量v 調用SparkContext.accumulator(v)來創建。在集羣上運行的任務可以通過add或者 "+="方法在累加器上進行累加操作(不支持Python)
廣播變量broadcast variables允許程序員將一個只讀的變量緩存在 每臺機器上,而不用在任務之間傳遞變量。廣播變量可被用於有效地給每個節點一 個大輸入數據集的副本。Spark還嘗試使用高效地廣播算法來分發變量,進而減少 通信的開銷。