1. 程式人生 > >大資料學習之SPARK計算天下

大資料學習之SPARK計算天下

學習大資料技術,SPARK無疑是繞不過去的技術之一,它的重要性不言而喻,本文將通過提問的形式圍繞著SPARK進行介紹,希望對大家有幫助,與此同時,感謝為本文提供素材的科多大資料的武老師。

為了輔助大家更好去了解大資料技術,本文集中討論Spark的一系列技術問題,大家在學習過程中如果遇到困難,可以留言互動,我都將「知無不言,言無不盡」!

//話題1:MapReduce的侷限性有哪些?

回覆:

① MapReduce框架侷限性

它僅支援Map和Reduce兩種操作,而且處理效率低效,具體有這四點:

a. Map中間結果寫磁碟, Reduce寫HDFS,多個MR之間通過HDFS交換資料;

b. 任務排程和啟動開銷大;

c. 無法充分利用記憶體;

d. Map端和Reduce端均需要排序;

而且它不適合迭代計算(如機器學習、 圖計算等), 互動式處理(資料探勘)和流式處理(點選日誌分析)。

② MapReduce程式設計不夠靈活,最好嘗試scala函數語言程式設計。

//話題2:現有的各種計算框架有哪些?

回覆:

① 批處理有MapReduce、Hive、Pig

② 流式計算有Storm

③ 互動式計算有Impala、Presto

而Spark是一種靈活的框架,可同時進行批處理、流式計算、互動式計算!

//話題3:Spark到底有哪些特點?

回覆:

高效( 比MapReduce快10~100倍)性

① 記憶體計算引擎, 提供Cache機制來支援需要反覆迭代計算或者多次資料共享, 減少資料讀取的IO開銷

② DAG引擎, 減少多次計算之間中間結果寫到HDFS的開銷

③ 使用多執行緒池模型來減少task啟動開稍, shuffle過程中避免

④ 不必要的sort操作以及減少磁碟IO操作

易用性

① 提供了豐富的API, 支援Java, Scala, Python和R四種語言

② 程式碼量比MapReduce少2~5倍

能與Hadoop整合

① 讀寫HDFS/Hbase

② 與YARN整合

//話題4:Spark中的RDD如何理解?

回覆:

RDD(Resilient Distributed Datasets),彈性分散式資料集,有以下幾個特點:

① 分佈在叢集中的只讀物件集合(由多個Partition構成)

② 可以儲存在磁碟或記憶體中(多種儲存級別)

③ 通過並行“轉換” 操作構造

④ 失效後自動重構

//話題5:Spark中的RDD有哪些操作?

回覆:

Transformation,可通過程式集合或者Hadoop資料集構造一個新的RDD,通過已有的RDD產生新的RDD,舉例: map,filter,groupBy,reduceBy;

Action,通過RDD計算得到一個或者一組值,舉例:count,reduce,saveAsTextFile;

而它們的介面定義方式不同,Transformation: RDD[X] -> RDD[Y];Action: RDD[X] -> Z (Z不是一個RDD, 可能是基本型別, 陣列等)

同時,對於惰性執行( Lazy Execution)也有區別,Transformation只會記錄RDD轉化關係, 並不會觸發計算;Action是觸發程式執行(分散式) 的運算元;

//話題6:Spark提交任務執行的命令?

回覆:

spark-submit\

--masteryarn-cluster\

--class com.xxx.examples.WordCount\

--driver-memory 2g\

--driver-cores 1\

--executor-memory 3g\

--executor-cores 3\

--num-executors 3

//話題7:Spark的執行模式?

回覆:

① local(本地模式),單機執行, 通常用於測試。

② standalone(獨立模式),獨立執行在一個叢集中。

③ YARN/mesos,執行在資源管理系統上,比如YARN或mesos。其中Spark On YARN存在兩種模式yarn-client和yarn-cluster。

//話題8:Spark的本地模式怎麼理解?

回覆:

將Spark應用以多執行緒方式,直接執行在本地,便於除錯。本地模式分類如下:

① local:只啟動一個executor

② local[K]:啟動K個executor       

③ local[*]:啟動跟cpu數目相同的executor

//話題9:Spark On Yarn模式的執行機制?

回覆:

追蹤一個應用程式執行過程

bin/spark-submit --master yarn-cluster --class …

core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala

yarn/src/main/scala/org/apache/spark/deploy/yarn/Client.scala

yarn/src/main/scala/org/apache/spark/deploy/yarn/ApplicationMaster.scala

core/src/main/scala/org/apache/spark/SparkContext.scala

core/src/main/scala/org/apache/spark/executor/Executor.scala