天天看點

Spark系列之Spark概述第一章 Spark概述

title: Spark系列

What is Apache Spark™?

Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.

第一章 Spark概述

1.1 Spark的産生背景

1.1.1 MapReduce的發展

1.1.1.1 MRv1的缺陷

早在 Hadoop1.x 版本,當時采用的是 MRv1 版本的 MapReduce 程式設計模型。MRv1版本的實作都封裝在 org.apache.hadoop.mapred 包中,MRv1 的 Map 和 Reduce 是通過接口實作的。MRv1包括三個部分:

運作環境(JobTracker和TaskTracker)
程式設計模型(MapReduce)
資料處理引擎(MapTask和ReduceTask)
           

MRv1 存在以下不足:

可擴充性不足

在運作時,JobTracker既負責資源管理又負責任務排程,當叢集繁忙時,JobTracker很容易成為瓶頸,最終導緻它的可擴充性問題。
           

可用性差

采用了單節點的Master,沒有備用Master及選舉操作,這導緻一旦Master出現故障,整個叢集将不可用。
           

資源使用率低

TaskTracker使用“slot”等量劃分本節點上的資源量。“slot”代表計算資源(CPU、記憶體等)。一個Task擷取到一個slot後才有機會運作,Hadoop排程器負責将各個TaskTracker上的空閑slot配置設定給Task使用。一些Task并不能充分利用slot,而其他Task也無法使用這些空閑的資源。slot分為Map slot和Reduce slot兩種,分别供MapTask 和ReduceTask 使用。有時會因為作業剛剛啟動等原因導緻MapTask很多,而Reduce Task任務還沒有排程的情況,這時Reduce slot也會被閑置。 
slot ===> container
           

不能支援多種計算引擎架構

無法通過可插拔方式将自身的MapReduce架構替換為其他實作,如Spark、Storm、flink等。
           

1.1.1.2 MRv2的缺陷

Apache為了解決MRv1中的缺陷,對Hadoop進行了更新改造。MRv2就誕生了。

MRv2中,重用了MRv1中的程式設計模型和資料處理引擎。但是運作時環境被重構了。JobTracker被拆分成了通用的

資源排程平台(ResourceManager,簡稱RM)、
節點管理器(NodeManager)、
負責各個計算架構的任務排程模型(ApplicationMaster,簡稱AM)。
           

​ ResourceManager 依然負責對整個叢集的資源管理,但是在任務資源的排程方面隻負責将資源封裝為Container配置設定給 ApplicationMaster 的一級排程,二級排程的細節将交給 ApplicationMaster 去完成,這大大減輕了ResourceManager 的壓力,使得 ResourceManager 更加輕量。NodeManager 負責對單個節點的資源管理,并将資源資訊、Container 運作狀态、健康狀況等資訊上報給ResourceManager。ResourceManager 為了保證Container 的使用率,會監控 Container,如果Container 未在有限的時間内使用,ResourceManager 将指令NodeManager 殺死 Container,以便于将資源配置設定給其他任務。MRv2 的核心不再是 MapReduce 架構,而是YARN。在以 YARN 為核心的MRv2 中,MapReduce 架構是可插拔的,完全可以替換為其他分布式計算模型實作,比如Spark、Storm等。

​ Hadoop MRv2 雖然解決了 MRv1 中的一些問題,但是由于對 HDFS 的頻繁操作(包括計算結果持久化、資料備份、資源下載下傳及 Shuffle 等)導緻磁盤 I/O 成為系統性能的瓶頸,是以隻适用于離線資料處理或批處理,而不能支援對疊代式、互動式、流式資料的處理。

1.1.2 Spark的産生

Spark系列之Spark概述第一章 Spark概述

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

1、減少磁盤I/O:

随着實時大資料應用越來越多,Hadoop作為離線的高吞吐、低響應架構已不能滿足這類需求。Hadoop MapReduce 的 map 端将中間輸出和結果存儲在磁盤中,reduce 端又需要從磁盤讀寫中間結果,勢必造成磁盤IO成為瓶頸。Spark 允許将 map 端的中間輸出和結果存儲在記憶體中,reduce 端在拉取中間結果時避免了大量的磁盤I/O。Hadoop YARN 中的 ApplicationMaster 申請到Container後,具體的任務需要利用NodeManager 從 HDFS 的不同節點下載下傳任務所需的資源(如Jar包),這也增加了磁盤I/O。Spark 将應用程式上傳的資源檔案緩沖到 Driver 本地檔案服務的記憶體中,當 Executor 執行任務時直接從 Driver 的記憶體中讀取,也節省了大量的磁盤 I/O。
           

2、增加并行度:

由于将中間結果寫到磁盤與從磁盤讀取中間結果屬于不同的環節,Hadoop 将它們簡單的通過串行執行銜接起來。Spark 把不同的環節抽象為 Stage,允許多個 Stage 既可以串行執行,又可以并行執行。
           

3、避免重新計算:

當Stage中某個分區的Task執行失敗後,會重新對此Stage排程,但在重新排程的時候會過濾已經執行成功的分區任務,是以不會造成重複計算和資源浪費。
MapReduce:
	mapper階段    reduce階段
Spark:
	stage1    stage2    stage3    stage4    ......
	多個stage中間會有shuffle
	可以選擇性的持久化某個階段的執行結果
	DAG:有向無環圖
           

4、可選的Shuffle和排序:

Hadoop MapReduce在Shuffle之前有着固定的排序操作(隻能對key排字典順序),而Spark則可以根據不同場景選擇在map端排序或者reduce端排序。
           

5、靈活的記憶體管理政策:

Spark将記憶體分為堆上的存儲記憶體、堆外的存儲記憶體、堆上的執行記憶體、堆外的執行記憶體4個部分。Spark既提供了執行記憶體和存儲記憶體之間是固定邊界的實作,又提供了執行記憶體和存儲記憶體之間是“軟”邊界的實作。Spark預設使用“軟”邊界的實作,執行記憶體或存儲記憶體中的任意一方在資源不足時都可以借用另一方的記憶體,最大限度的提高資源的使用率,減少對資源的浪費。Spark由于對記憶體使用的偏好,記憶體資源的多寡和使用率就顯得尤為重要,為此Spark的記憶體管理器提供的Tungsten實作了一種與作業系統的記憶體Page非常相似的資料結構,用于直接操作作業系統記憶體,節省了建立的Java對象在堆中占用的記憶體,使得Spark對記憶體的使用效率更加接近硬體。Spark會給每個Task配置設定一個配套的任務記憶體管理器,對Task粒度的記憶體進行管理。Task的記憶體可以被多個内部的消費者消費,任務記憶體管理器對每個消費者進行Task記憶體的配置設定與管理,是以Spark對記憶體有着更細粒度的管理。
           

​ 基于以上所列舉的優化,Spark官網聲稱性能比Hadoop快100倍。即便是記憶體不足需要磁盤I/O時,其速度也是Hadoop的10倍以上。那麼 Spark 會取代 Hadoop 麼?

Spark是MapReduce的替代方案,而且相容HDFS、Hive,可融入Hadoop的生态系統,以彌補MapReduce的不足。
           

1.2 Spark概念

官網:http://spark.apache.org/

Spark系列之Spark概述第一章 Spark概述
Apache Spark is a fast and general-purpose cluster computing system. It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs. It also supports a rich set of higher-level tools including Spark SQL for SQL and structured data processing, MLlib for machine learning, GraphX for graph processing, and Spark Streaming.
           

上面是老的版本的介紹

下面是新的版本的介紹

What is Apache Spark™?
Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.
Spark是一個多語言引擎,用于在單節點機器或叢集上執行資料工程、資料科學和機器學習。
           
Spark是一種快速、通用、可擴充的大資料分析引擎
2009年誕生于加州大學伯克利分校AMP實驗室
2010年開源
2013年6月成為Apache孵化項目
2014年2月成為Apache頂級項目
項目代碼使用Scala語言進行編寫
           

​ Spark 生态圈也稱為 BDAS(伯克利資料分析棧),是伯克利APMLab實驗室打造的,力圖在算法(Algorithms)、機器(Machines)、人(People)之間通過大規模內建來展現大資料應用的一個平台。伯克利AMPLab運用大資料、雲計算、通信等各種資源以及各種靈活的技術方案,對海量不透明的資料進行甄别并轉化為有用的資訊,以供人們更好的了解世界。該生态圈已經涉及到機器學習、資料挖掘、資料庫、資訊檢索、自然語言處理和語音識别等多個領域。

​ Spark 生态圈以 SparkCore 為核心,從 HDFS、Amazon S3 或者 HBase 等持久層讀取資料,以Mesos、YARN和自身攜帶的 Standalone 為資料總管排程 Job 完成 Spark 應用程式的計算。 這些應用程式可以來自于不同的元件,如 SparkShell/SparkSubmit 的批處理、SparkStreaming 的實時處理應用、SparkSQL 的結構化資料處理/即席查詢、BlinkDB 的權衡查詢、MLlib/MLbase 的機器學習、GraphX 的圖處理和 PySpark 的數學/科學計算和SparkR的資料分析等等。

​ 目前,Spark生态系統已經發展成為一個包含多個子項目的集合,其中包含SparkSQL、SparkStreaming、GraphX、MLib、SparkR等子項目,Spark是基于記憶體計算的大資料并行計算架構。除了擴充了廣泛使用的MapReduce計算模型,而且高效地支援更多計算模式,包括互動式查詢和流處理。Spark适用于各種各樣原先需要多種不同的分布式平台的場景,包括批處理、疊代算法、互動式查詢、流處理。通過在一個統一的架構下支援這些不同的計算,Spark使我們可以簡單而低耗地把各種處理流程整合在一起。而這樣的組合,在實際的資料分析過程中是很有意義的。不僅如此,Spark的這種特性還大大減輕了原先需要對各種平台分别管理的負擔。Spark基于記憶體計算,提高了在大資料環境下資料處理的實時性,同時保證了高容錯性和高可伸縮性,允許使用者将Spark部署在大量廉價硬體之上,形成叢集。Spark得到了衆多大資料公司的支援,這些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿裡、騰訊、京東、攜程、優酷洋芋。目前百度的Spark已應用于鳳巢、大搜尋、直達号、百度大資料等業務;阿裡利用GraphX建構了大規模的圖計算和圖挖掘系統,實作了很多生産系統的推薦算法;17年左右,騰訊 Spark 叢集達到 8000 台的規模,是目前已知的世界上最大的Spark叢集。

​ 大一統的軟體棧,各個元件關系密切并且可以互相調用,這種設計有幾個好處:

1、軟體棧中所有的程式庫和進階元件都可以從下層的改進中獲益。
2、運作整個軟體棧的代價變小了。不需要運作5到10套獨立的軟體系統了,一個機構隻需要運作一套軟體系統即可。系統的部署、維護、測試、支援等大大縮減。
3、能夠建構出無縫整合不同處理模型的應用。
           

1.3 Spark特點

​ 這個其實是老的版本的中的全量的特點。新的版本官網中隻有Key features(主要特征)了。為了全面的學習,我們給所有的特點都看看。

1.3.1 Speed:快速高效

随着實時大資料應用越來越多,Hadoop 作為離線的高吞吐、低響應架構已不能滿足這類需求。Hadoop MapReduce 的 Job 将中間輸出和結果存儲在 HDFS 中,讀寫 HDFS 造成磁盤 IO 成為瓶頸。Spark 允許将中間輸出和結果存儲在記憶體中,節省了大量的磁盤IO。Apache Spark 使用最先進的DAG排程程式,查詢優化程式和實體執行引擎,實作批量和流式資料的高性能。同時 Spark 自身的 DAG 執行引擎也支援資料在記憶體中的計算。Spark官網聲稱性能比Hadoop快100倍。即便是記憶體不足需要磁盤IO,其速度也是Hadoop的10倍以上。
           

1.3.2 Ease of Use:簡潔易用

Spark現在支援Java、Scala、Python和R等程式設計語言編寫應用程式,大大降低了使用者的門檻。自帶了80多個高等級操作符,允許在Scala,Python,R的shell中進行互動式查詢,可以非常友善的在這些Shell中使用Spark叢集來驗證解決問題的方法。
           

1.3.3 Generality:通用,全棧式資料處理

​ Spark提供了統一的解決方案。Spark統一的解決方案非常具有吸引力,畢竟任何公司都想用統一的平台 去處理遇到的問題,減少開發和維護的人力成本和部署平台的物力成本。

支援批處理(Spark Core)

Spark Core是Spark的核心功能實作,包括:SparkContext的初始化(DriverApplication通過SparkContext送出)、部署模式、存儲體系、任務送出與執行、計算引擎等。Spark Core中還包含了對RDD (resilient distributed dataset,彈性分布式資料集)的 API定義。
           

支援互動式查詢(Spark SQL)

Spark SQL 是Spark來操作結構化資料的程式包,可以讓我們使用SQL語句的方式來查詢資料,Spark支援多種資料源,包含Hive表,parquet以及JSON等内容。
           

支援流式計算(Spark Streaming)

與MapReduce隻能處理離線資料相比,Spark還支援實時的流計算。Spark依賴Spark Streaming對資料進行實時的處理。
           

支援機器學習(Spark MLlib)

提供機器學習相關的統計、分類、回歸等領域的多種算法實作。其一緻的API接口大大降低了使用者的學習成本。
           

支援圖計算(Spark GraghX)

提供圖計算處理能力,支援分布式, Pregel提供的API可以解決圖計算中的常見問題。
           

支援Python操作–PySpark

Spark提供了一個Python_Shell,即pyspark,進而可以以互動的方式使用Python編寫Spark程式。pyspark裡最核心的子產品是SparkContext(簡稱sc),最重要的資料載體是RDD。RDD就像一個NumPyarray或者一個Pandas Series,可以視作一個有序的item集合。隻不過這些item并不存在driver端的記憶體裡,而是被分割成很多個partitions,每個partition的資料存在叢集的executor的記憶體中。
           

支援R語言–SparkR

從Spark1.4版本(2015.6)開始添加了SparkR API,它的出現能讓資料分析師和資料科學家在Spark平台上使用R語言分析大型資料集以及互動式作業。
           

1.3.4 Runs Everywhere:相容

​ 可用性高。Spark也可以不依賴于第三方的資源管理和排程器,它實作了Standalone作為其内置的資源管理和排程架構,這樣進一步降低了Spark的使用門檻,使得所有人都可以非常容易地部署和使用Spark,此模式下的Master可以有多個,解決了單點故障問題。當然,此模式也完全可以使用其他叢集管理器替換,比如YARN、Mesos、Kubernetes、EC2等

豐富的資料源支援。Spark除了可以通路作業系統自身的本地檔案系統和HDFS之外,還可以通路Cassandra、HBase、Hive、Tachyon以及任何Hadoop的資料源。這極大地友善了已經使用HDFS、HBase的使用者順利遷移到Spark。

Spark支援的幾種部署方案:

Standalone:Spark自己可以給自己配置設定資源(Master,Worker)
YARN:Spark可以運作在Hadoop的YARN上面
Mesos:Spark可以運作在Mesos裡面(Mesos 類似于YARN的一個資源排程架構)
Kubernetes:Spark接收 Kubernetes的資源排程
           

1.4 Spark應用場景

目前大資料處理場景有以下幾個類型:

1、複雜的批處理(Batch Data Processing),偏重點在于處理海量資料的能力,至于處理速度可忍
受,通常的時間可能是在數十分鐘到數小時;
2、基于曆史資料的互動式查詢(Interactive Query),通常的時間在數十秒到數十分鐘之間
3、基于實時資料流的資料處理(Streaming Data Processing),通常在數百毫秒到數秒之間
           

目前對以上三種場景需求都有比較成熟的處理架構:

第一種情況可以用Hadoop的MapReduce來進行批量海量資料處理
第二種情況可以Impala、Kylin進行互動式查詢
第三中情況可以用Storm、SS、Flink分布式處理架構處理實時流式資料
           

以上三者都是比較獨立,各自一套維護成本比較高,而Spark的出現能夠一站式平台滿意以上需求

第一種情況使用Spark Core解決
第二種情況使用Spark SQL解決
第三種情況使用Spark Streaming解決
           

通過以上分析,總結Spark場景有以下幾個:

1、Spark是基于記憶體的疊代計算架構,适用于需要多次操作特定資料集的應用場合。需要反複操作的次數越
多,所需讀取的資料量越大,受益越大,資料量小但是計算密集度較大的場合,受益就相對較小
2、由于RDD的特性,Spark不适用那種異步細粒度更新狀态的應用,例如web服務的存儲或者是增量的web爬
蟲和索引。就是對于那種增量修改的應用模型不适合
3、資料量不是特别大,但是要求實時統計分析需求
           

典型行業應用場景:

1、Yahoo将Spark用在Audience Expansion中的應用,進行點選預測和即席查詢等
2、淘寶技術團隊使用了Spark來解決多次疊代的機器學習算法、高計算複雜度的算法等。應用于内容推薦、
社群發現等
3、騰訊大資料精準推薦借助Spark快速疊代的優勢,實作了在“資料實時采集、算法實時訓練、系統實時預
測”的全流程實時并行高維算法,最終成功應用于廣點通PCTR投放系統上。
4、優酷洋芋将Spark應用于視訊推薦(圖計算)、廣告業務,主要實作機器學習、圖計算等疊代計算。
5、……

           

開發工種的工作任務的未來趨勢:

1、SQL 業務開發
2、web ui 平台開發
3、底層一般都是 流式計算引擎
           

開發:可能都不是直接寫代碼。 而是進行拖拽式的進行開發

聲明:

        文章中代碼及相關語句為自己根據相應了解編寫,文章中出現的相關圖檔為自己實踐中的截圖和相關技術對應的圖檔,若有相關異議,請聯系删除。感謝。轉載請注明出處,感謝。

By luoyepiaoxue2014

B站: https://space.bilibili.com/1523287361 點選打開連結

微網誌位址: http://weibo.com/luoyepiaoxue2014 點選打開連結

繼續閱讀