1. 程式人生 > >《深入理解Spark:核心思想與原始碼分析》(第2章)

《深入理解Spark:核心思想與原始碼分析》(第2章)

《深入理解Spark:核心思想與原始碼分析》一書第一章的內容請看連結《第1章 環境準備》

本文主要展示本書的第2章內容:

Spark設計理念與基本架構

“若夫乘天地之正,而御六氣之辯,以遊無窮者,彼且惡乎待哉?”

——《莊子·逍遙遊》

n本章導讀:

上一章,介紹了Spark環境的搭建,為方便讀者學習Spark做好準備。本章首先從Spark產生的背景開始,介紹Spark的主要特點、基本概念、版本變遷。然後簡要說明Spark的主要模組和程式設計模型。最後從Spark的設計理念和基本架構入手,使讀者能夠對Spark有巨集觀的認識,為之後的內容做一些準備工作。

Spark是一個通用的平行計算框架,由加州伯克利大學(

UCBerkeley)的AMP實驗室開發於2009年,並於2010年開源。2013年成長為Apache旗下為大資料領域最活躍的開源專案之一。Spark也是基於map reduce 演算法模式實現的分散式計算框架,擁有Hadoop MapReduce所具有的優點,並且解決了Hadoop MapReduce中的諸多缺陷。

2.1 初識Spark

2.1.1 Hadoop MRv1的侷限

早在Hadoop1.0版本,當時採用的是MRv1版本的MapReduce程式設計模型。MRv1版本的實現都封裝在org.apache.hadoop.mapred包中,MRv1MapReduce是通過介面實現的。MRv1

包括三個部分:

q執行時環境(JobTrackerTaskTracker);

q程式設計模型(MapReduce);

q資料處理引擎(Map任務和Reduce任務)。

MRv1存在以下不足:

q可擴充套件性差:在執行時,JobTracker既負責資源管理又負責任務排程,當叢集繁忙時,JobTracker很容易成為瓶頸,最終導致它的可擴充套件性問題。

q可用性差:採用了單節點的Master,沒有備用Master及選舉操作,這導致一旦Master出現故障,整個叢集將不可用。

q資源利用率低:TaskTracker 使用“slot”等量劃分本節點上的資源量。“slot”代表計算資源(

CPU、記憶體等)。一個Task 獲取到一個slot 後才有機會執行,Hadoop 排程器負責將各個TaskTracker 上的空閒slot 分配給Task 使用。一些Task並不能充分利用slot,而其他Task也無法使用這些空閒的資源。slot 分為Map slot Reduce slot 兩種,分別供MapTask Reduce Task 使用。有時會因為作業剛剛啟動等原因導致MapTask很多,而Reduce Task任務還沒有排程的情況,這時Reduce slot也會被閒置。

q不能支援多種MapReduce框架:無法通過可插拔方式將自身的MapReduce框架替換為其他實現,如SparkStorm等。

MRv1的示意如圖2-1

2-1        MRv1示意圖[1]

Apache為了解決以上問題,對Hadoop升級改造,MRv2最終誕生了。MRv2中,重用了MRv1中的程式設計模型和資料處理引擎。但是執行時環境被重構了。JobTracker被拆分成了通用的資源排程平臺(ResourceManager,簡稱RM)和負責各個計算框架的任務排程模型(ApplicationMaste,簡稱AM)。MRv2MapReduce的核心不再是MapReduce框架,而是YARN。在以YARN為核心的MRv2中,MapReduce框架是可插拔的,完全可以替換為其他MapReduce實現,比如SparkStorm等。MRv2的示意如圖2-2所示。

2-2        MRv2示意圖

         Hadoop MRv2雖然解決了MRv1中的一些問題,但是由於對HDFS的頻繁操作(包括計算結果持久化、資料備份及shuffle等)導致磁碟I/O成為系統性能的瓶頸,因此只適用於離線資料處理,而不能提供實時資料處理能力。

2.1.2 Spark使用場景

         Hadoop常用於解決高吞吐、批量處理的業務場景,例如離線計算結果用於瀏覽量統計。如果需要實時檢視瀏覽量統計資訊,Hadoop顯然不符合這樣的要求。Spark通過記憶體計算能力極大地提高了大資料處理速度,滿足了以上場景的需要。此外,Spark還支援SQL查詢,流式計算,圖計算,機器學習等。通過對JavaPythonScalaR等語言的支援,極大地方便了使用者的使用。

2.1.3 Spark的特點

         Spark看到MRv1的問題,對MapReduce做了大量優化,總結如下:

q快速處理能力。隨著實時大資料應用越來越多,Hadoop作為離線的高吞吐、低響應框架已不能滿足這類需求。Hadoop MapReduceJob將中間輸出和結果儲存在HDFS中,讀寫HDFS造成磁碟IO成為瓶頸。Spark允許將中間輸出和結果儲存在記憶體中,節省了大量的磁碟IO。同時Spark自身的DAG執行引擎也支援資料在記憶體中的計算。Spark官網聲稱效能比Hadoop100倍,如圖2-3所示。即便是記憶體不足需要磁碟IO,其速度也是Hadoop10倍以上。

2-3        HadoopSpark執行邏輯迴歸時間比較

q易於使用。Spark現在支援JavaScalaPythonR等語言編寫應用程式,大大降低了使用者的門檻。自帶了80多個高等級操作符,允許在ScalaPythonRshell中進行互動式查詢。

q支援查詢。Spark支援SQLHive SQL對資料查詢。

q支援流式計算。與MapReduce只能處理離線資料相比,Spark還支援實時的流計算。Spark依賴Spark Streaming對資料進行實時的處理,其流式處理能力還要強於Storm

q可用性高。Spark自身實現了Standalone部署模式,此模式下的Master可以有多個,解決了單點故障問題。此模式完全可以使用其他叢集管理器替換,比如YARNMesosEC2等。

q豐富的資料來源支援。Spark除了可以訪問作業系統自身的檔案系統和HDFS,還可以訪問Cassandra, HBase, Hive, Tachyon以及任何Hadoop的資料來源。這極大地方便了已經使用HDFSHbase的使用者順利遷移到Spark

2.2 Spark基礎知識

1.版本變遷

經過4年多的發展,Spark目前的版本是1.4.1。我們簡單看看它的版本發展過程。

1)Spark誕生於UCBerkeleyAMP實驗室(2009)。

2)Spark正式對外開源(2010)。

3)Spark 0.6.0版本釋出(2012-10-15),大範圍的效能改進,增加了一些新特性,並對Standalone部署模式進行了簡化。

4)Spark 0.6.2版本釋出(2013-02-07),解決了一些bug,並增強了系統的可用性。

5)Spark 0.7.0版本釋出(2013-02-27),增加了更多關鍵特性,例如:Python APISpark Streamingalpha版本等。

6)Spark 0.7.2版本釋出(2013-06-02),效能改進並解決了一些bug,新的API使用的例子。

7)Spark接受進入Apache孵化器(2013-06-21)。

8)Spark 0.7.3版本釋出(2013-07-16),一些bug的解決,更新Spark Streaming API等。

9)Spark 0.8.0版本釋出(2013-09-25),一些新功能及可用性改進。

10)Spark 0.8.1版本釋出(2013-12-19),支援Scala 2.9YARN 2.2Standalone部署模式下排程的高可用性,shuffle的優化等。

11)Spark 0.9.0版本釋出(2014-02-02),增加了GraphX,機器學習新特性,流式計算新特性,核心引擎優化(外部聚合、加強對YARN的支援)等。

12)Spark 0.9.1版本釋出(2014-04-09),增加使用YARN的穩定性,改進ScalaPython API的奇偶性。

相關推薦

深入理解Spark核心思想原始碼分析2

《深入理解Spark:核心思想與原始碼分析》一書第一章的內容請看連結《第1章 環境準備》 本文主要展示本書的第2章內容: Spark設計理念與基本架構 “若夫乘天地之正,而御六氣之辯,以遊無窮者,彼且惡乎待哉?” ——《莊子·逍遙遊》 n本章導讀: 上一章,介紹了Spark環境的搭建,為方便讀

深入理解SPARK核心思想原始碼分析》一書正式出版上市

自己犧牲了7個月的週末和下班空閒時間,通過研究Spark原始碼和原理,總結整理的《深入理解Spark:核心思想與原始碼分析》一書現在已經正式出版上市,目前京東、噹噹、天貓等網站均有銷售,歡迎感興趣的同學購買。我開始研究原始碼時的Spark版本是1.2.0,經過7個多月的研

深入理解Spark核心思想原始碼分析前言及第1

  自己犧牲了7個月的週末和下班空閒時間,通過研究Spark原始碼和原理,總結整理的《深入理解Spark:核心思想與原始碼分析》一書現在已經正式出版上市,目前亞馬遜、京東、噹噹、天貓等網站均有銷售,歡迎感興趣的同學購買。我開始研究原始碼時的Spark版本是1.2.0,經過7個多月的研究和出版社近4個月的流

深入理解SPARK核心思想原始碼分析》——SparkContext的初始化仲篇——SparkUI、環境變數及排程

《深入理解Spark:核心思想與原始碼分析》一書第一章的內容請看連結《第1章 環境準備》 《深入理解Spark:核心思想與原始碼分析》一書第二章的內容請看連結《第2章 SPARK設計理念與基本架構》 由於本書的第3章內容較多,所以打算分別開闢四篇隨筆分別展現。 本文展現第3章第二部分的內容:

深入理解Spark核心思想原始碼分析》——SparkContext的初始化伯篇——執行環境元資料清理器

《深入理解Spark:核心思想與原始碼分析》一書第一章的內容請看連結《第1章 環境準備》 《深入理解Spark:核心思想與原始碼分析》一書第二章的內容請看連結《第2章 SPARK設計理念與基本架構》 由於本書的第3章內容較多,所以打算分別開闢四篇隨筆分別展現。本文展現第3章第一部分的內容: 第3章

深入理解Spark-核心思想原始碼分析》讀書筆記1

前兩章 第一章主要是講如何安裝和配置spark,以及如何匯入spark原始碼除錯執行;第二章主要講的是上次那本書《Spark快速大資料分析》的內容,科普一下spark的知識。 第三章 SparkContext的初始化 1. 概述 這章的主要內容就

閱讀《大型網站技術架構核心原理案例分析五、六、七,結合《河北省重大技術需求征集系統》,列舉實例分析采用的可用性和可修改性戰術

定時 並不會 表現 做出 span class 硬件 進行 情況   網站的可用性描述網站可有效訪問的特性,網站的頁面能完整呈現在用戶面前,需要經過很多個環節,任何一個環節出了問題,都可能導致網站頁面不可訪問。可用性指標是網站架構設計的重要指標,對外是服務承諾,對內是考核指

學習Javascript數據結構算法2筆記1

布爾值 efi prim ray 叠代器 undefined ply 內部 HA 第 1 章 JavaScript簡介 使用 Node.js 搭建 Web 服務器 npm install http-server -g http-server JavaScript 的類型有

學習Javascript數據結構算法2筆記3

清空 tac math bcd lse += 基本類型 In 所有 第 3 章 1. 棧數據結構 棧是一種遵從後進先出(LIFO)原則的有序集合。新添加的或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧裏,新元素都靠近棧頂,舊元素都接近棧底。 1.1 棧的操

Beginng_Rust(譯)定義通用函式和結構完+1

在本章中,您將學習: •如何編寫單個函式定義,其呼叫可以有效地處理不同的資料型別 •如何使用型別推斷來避免指定使用的型別 通用功能 •如何編寫單個struct,tuple-struct或enum型別,其例項可以包含有效的不同資料型別 •如何使用兩個重要的標準通用

《TensorFlow實戰Google深度學習框架2》高清中文版PDF下載

《TensorFlow:實戰Google深度學習框架(第2版)》高清中文版PDF下載 領域旗艦重磅升級 新老谷歌專家聯袂 首度全面支援1.4.x程式碼 大量增補新版獨有核心功能 下載地址:https://pan.baidu.com/s/1uijUhufBV6nXNgz-VxZUGQ備用地址:https:/

【無私分享ASP.NET CORE 專案實戰】建立區域Areas,新增TagHelper

目錄索引 簡介   在Asp.net Core VS2015中,我們發現還有很多不太簡便的地方,比如右擊新增檢視,轉到試圖頁等功能圖不見了,雖然我們可以通過工具欄的自定義命令,把這兩個右擊選單新增上,但是貌似是灰色的不能用。   其實,這樣也好,通過手動建立,更讓我們深刻的理解M

【無私分享ASP.NET CORE 專案實戰】釋出專案到 Linux 上執行 Core 專案

目錄索引 簡介   ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執

【無私分享ASP.NET CORE 專案實戰】讀取配置檔案 appsettings.json

目錄索引 簡介   在我們之前的Asp.net mvc 開發中,一提到配置檔案,我們不由的想到 web.config 和 app.config,在 core 中,我們看到了很多的變化,新的配置系統顯得更加輕量級,具有更好的擴充套件性,並且支援多樣化的資料來源。   部落格園對於這個的

【無私分享ASP.NET CORE 專案實戰】讀取配置檔案 讀取自定義配置檔案

目錄索引 簡介   但隨之產生了問題:我們使用的是在 Startup.cs 中(如下圖)來實現配置讀取,有兩個問題 ① 我們如果定義N種配置,是否要再這裡新增N條這樣的配置 ; ② 如果我們的配置不想寫在appsettings.json中呢     解決問題

【無私分享ASP.NET CORE 專案實戰十三】Asp.net Core 使用MyCat分散式資料庫,實現讀寫分離

目錄索引 簡介   MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中

【無私分享ASP.NET CORE 專案實戰】Code First 建立資料庫和資料表

目錄索引 簡介   本章我們來介紹下Asp.net Core 使用 CodeFirst 建立資料庫和表,通過 控制檯 和 dotnet ef 兩種方式 修改EF上下文物件,新增測試類   我修改了一下名字,Domains 改為了 wkmvc.Data   我們新建一個

【無私分享ASP.NET CORE 專案實戰】檔案操作 FileHelper

目錄索引 簡介   在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自己封裝方法去實現。今天,我們就對一些基本

【無私分享ASP.NET CORE 專案實戰】Repository倉儲 UnitofWork

1 public abstract class Repository<T> : IRepository<T> where T : class 2 { 3 #region 資料上下文 4 5 /// <s

【無私分享ASP.NET CORE 專案實戰】EntityFramework下領域驅動設計的應用

這好像就是比我的多了一個“中轉層”,把我們的介面作為了一箇中轉,領域層繼承了倉儲實現業務和資料操作,這有什麼實際意義嗎?希望大家指正一下: 我不理解的是,如果是按照這樣,那麼我如果要修改註冊方法,比如我要在上面方法中傳遞 eamil,name,password 的基礎上還需要傳遞手機號碼,那麼我需要修改