spark 初體驗
阿新 • • 發佈:2018-12-06
一、spark的產生背景
(1)MapReduce的發展:
- MRv1的缺點:
- 早在 Hadoop1.x 版本,當時採用的是 MRv1 版本的 MapReduce 程式設計模型。MRv1 版本的實現 都封裝在 org.apache.hadoop.mapred 包中,MRv1 的 Map 和 Reduce 是通過介面實現的。
MRv1 只有三個部分: 執行時環境(JobTracker 和 TaskTracker)、程式設計模型(MapReduce)、 資料處理引擎(MapTask 和 ReduceTask)。- 可擴充套件性差:在執行時,JobTracker 既負責資源管理
又負責任務排程,當叢集繁忙時, JobTracker 很容易成為瓶頸,最終導致它的可擴充套件性問題。- 可用性差:採用了單節點的 Master,沒有備用 Master 及選舉操作,這導致一旦 Master 出現故障,整個叢集將不可用。(單點故障)
- 資源利用率低:TaskTracker 使用“slot”等量劃分本節點上的資源量。slot 分為 Map slot 和 Reduce slot 兩種,分別供 MapTask 和 ReduceTask 使用。有時會因為作業剛剛啟動等原因導致 MapTask 很多,而 Reduce Task 任 務還沒有排程的情況,這時 Reduce slot 也會被閒置。
- 不能支援多種MapReduce框架:無法通過可插拔方式將自身的 MapReduce 框架替換為其他實現,如 Spark、Storm 等。
2. MRv2的缺點:
- MRv2中,重用了 MRv1 中的程式設計模型和資料處理引擎。但是執行時環境被重構了。JobTracker 被拆分成了通用的:資源排程平臺(ResourceManager,簡稱 RM)、節點管理器(NodeManager)、負責各個計算框架的任務排程模型(ApplicationMaster,簡稱 AM)。但是由於對 HDFS 的頻繁操作(包括計算結 果持久化、資料備份、資源下載及 Shuffle 等)導致磁碟 I/O 成為系統性能的瓶頸
,因此只適用於離線資料處理或批處理,而不能支援對迭代式、互動式、流式資料的處理。
(2)Spark的優勢:
- 減少了磁碟的I/O:Spark 允許將 map 端的中間輸出和結果儲存在記憶體中,reduce 端在拉取中間結果時避免了大量的磁碟 I/O。Spark 將應用程式上傳的資原始檔緩衝到 Driver 本地檔案服務的記憶體中,當 Executor 執行任務時直接從 Driver 的記憶體 中讀取,也節省了大量的磁碟 I/O。
- 增加並行度:park 把不同的環節抽象為 Stage,允許多個 Stage 既可以序列執行,又可以並行執行。
- 避免重複計算:當 Stage 中某個分割槽的 Task 執行失敗後,會重新對此 Stage 排程,但在重新 排程的時候會過濾已經執行成功的分割槽任務,所以不會造成重複計算和資源浪費。
- 可選擇的shuffle:Spark 可以根據不同場景選擇在 map 端排序或者 reduce 端排序。
- 靈活的記憶體管理策略:Spark 將記憶體分為堆上的儲存記憶體、堆外的儲存記憶體、堆上的執行記憶體、堆外的執行記憶體 4 個部分。Spark 既提供了執行記憶體和儲存記憶體之間是固定邊界的實現,又提供了執行記憶體和儲存記憶體之間是“軟”邊界的實現。Spark 預設使用“軟”邊界的實現,執行記憶體或儲存記憶體中的任意一方在資源不足時都可以借用另一方的記憶體,最大限度的提高 資源的利用率,減少對資源的浪費。。Spark 由於對記憶體使用的偏好,記憶體資源的多寡和使用 率就顯得尤為重要,為此 Spark 的記憶體管理器提供的 Tungsten 實現了一種與作業系統的記憶體 Page 非常相似的資料結構,用於直接操作作業系統記憶體,節省了建立的 Java 物件在堆中佔 用的記憶體,使得 Spark 對記憶體的使用效率更加接近硬體。Spark 會給每個 Task 分配一個配套 的任務記憶體管理器,對 Task 粒度的記憶體進行管理。Task 的記憶體可以被多個內部的消費者消費,任務記憶體管理器對每個消費者進行 Task 記憶體的分配與管理,因此 Spark 對記憶體有著更細粒度的管理
(3)spark生態:
Spark 生態圈以 SparkCore 為核心,從 HDFS、Amazon S3 或者 HBase 等持久層讀取資料,以 MESOS、YARN 和自身攜帶的 Standalone 為資源管理器排程 Job 完成 Spark 應用程式的計算。
- SparkShell/SparkSubmit 的批處理
- SparkStreaming 的實時處理應用
- SparkSQL 的結構化資料處理/即席查詢
- BlinkDB 的權衡查詢
- MLlib/MLbase的機器學習、GraphX的圖處理和PySpark的數學/科學計算和SparkR的資料分析。
(4)spark特點:
- Seed快速高效:Spark 允許將中間輸出和結果儲存在記憶體中,節省了大量的磁碟 IO。Apache Spark 使用最先進的 DAG 排程程式,查詢優化程式和物理執行引擎,實現批量和流式資料的高效能。同時 Spark 自身的 DAG 執行引擎也支援資料在記憶體中的計算。Spark 官網聲稱效能比 Hadoop 快 100 倍。即便是記憶體不足需要磁碟 IO,其速度也是 Hadoop 的 10 倍以上
-
- Ease of Use 簡潔易用:Spark 現在支援 Java、Scala、Python 和 R 等程式語言編寫應用程式,大大降低了使用者的門檻。自帶了 80 多個高等級操作符(運算元),允許在 Scala,Python,R 的 shell 中進行互動式查詢,可 以非常方便的在這些 Shell 中使用 Spark 叢集來驗證解決問題的方法。
- Generality:全棧式資料處理:支援批處理、支援互動式查詢、支援互動式查詢、支援機器學習、支援圖計算。
-
- 可用性高:Spark 也可以不依賴於第三方的資源管理和排程器,它實現了 Standalone 作為其 內建的資源管理和排程框架,這樣進一步降低了 Spark 的使用門檻,使得所有人都可以非常 容易地部署和使用 Spark,此模式下的 Master 可以有多個,解決了單點故障問題。當然,此模式也完全可以使用其他叢集管理器替換,比如 YARN、Mesos、Kubernetes、EC2 等。
- 豐富的資料來源支援:Spark 除了可以訪問作業系統自身的本地檔案系統和 HDFS 之外,還可 以訪問 Cassandra、HBase、Hive、Tachyon(基於記憶體儲存) 以及任何 Hadoop 的資料來源。這極大地方便了已經 使用 HDFS、HBase 的使用者順利遷移到 Spark。
(5)spark的應用場景:
① Yahoo 將 Spark 用在 Audience Expansion 中的應用,進行點選預測和即席查詢等
② 淘寶技術團隊使用了 Spark 來解決多次迭代的機器學習演算法、高計算複雜度的演算法等。 應用於內容推薦、社群發現等
③ 騰訊大資料精準推薦藉助 Spark 快速迭代的優勢,實現了在“資料實時採集、演算法實時訓練、系統實時預測”的全流程實時並行高維演算法,最終成功應用於廣點通 PCTR 投放 系統上。
優酷土豆將 Spark 應用於視訊推薦(圖計算)、廣告業務,主要實現機器學習、圖計算等 迭代計算。