大資料學習之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