Spark

一  爲什麼用SPARK

  • 先進的大數據分佈式編程和計算框架
  • 試圖代替HADOOP(SPARK可以獨立於HADOOP)
  • 內存分佈式計算:運行速度快
  • 可以用不同語言編程(JAVA,SCALA,R,PYTHON)
  • 可以從不同的數據源取數據(HDFS,Cassandra,HBase)
  • 實現不同的大數據功能:Spark Core,Spark SQL,Spark Streaming,Spark MLIB  以及GraphX

優點:

  1. 運行速度快
  2. 支持迭代式和交互式運行
  3. 彈性數據集支持數據容錯
  4. 支持有向無環圖優化

二 SPARK的幾種運行模式

批處理--用於大規模的分佈式數據處理

流方式--Spark流用於傳送和處理實時數據

交互式:用於處理在內存中的大塊數據,較低的延遲性

三  SPARK的數據讀取和存儲

Spark可以從以下系統訪問數據

  • hadoop HDFS 以及HIVE,HBASE等生態圈部件
  • Amazon S3
  • Cassandra, Mongodb
  • 其他流工具 如Flume,Kafka所支持的各協議如AVRO另外Spark 可以支持一下文件格式:text,sequencefiles,AVRO,parquet

四 SPARK的主要部件

  1. SPARK CORE:包含spark的主要基本功能.所有跟RDD有關的API都出自於SPARK CORE
  2. Spark SQL:spark中用於結構化數據處理的軟件包
  3. spark streaming:spark中用於處流數據的部件
  4. MLlib:Spark中用來進行機器學習和數學建模的軟件包
  5. GraphX:spark中用來進行圖計算(如社交媒體關係)的庫函數
  6. 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還嘗試使用高效地廣播算法來分發變量,進而減少 通信的開銷。

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