1. 程式人生 > >【Spark深入學習-11】Spark基本概念和運行模式

【Spark深入學習-11】Spark基本概念和運行模式

nmf 磁盤 大數據平臺 並不是 鼠標 .cn 管理系統 大型數據集 spa

----本節內容-------

1.大數據基礎

1.1大數據平臺基本框架

1.2學習大數據的基礎

1.3學習Spark的Hadoop基礎

2.Hadoop生態基本介紹

2.1Hadoop生態組件介紹

2.2Hadoop計算框架介紹

3.Spark概述

3.1 Spark出現的技術背景

3.2 Spark核心概念介紹

4.Spark運行模式

4.1.Spark程序組成

4.2.Spark運行模式

5.參考資料

---------------------

技術分享

1.大數據基礎

1.1 大數據平臺基本框架

從全局了解一下大數據技術的基本框架,在宏觀上有個認識,不至於盲人摸象。董先生貼出來的這個圖,可以說是非常通用且普遍的一張圖, 不管你是哪個行業,框架用這個套,準沒錯。通用就是大而全的東西,不會考慮細節了。在實際生產中,每一個細節都不是省油的燈。當然 全局的整體把握,對spark理解非常重要,它在整個體系中扮演什麽角色,這個很基礎 。

技術分享

整體架構分為6個層面

1) 數據收集

數據采集,是匯聚的一個過程,如淘寶,商家,用戶,用戶行為,買其他公司數據,數據集市等,要收集數據過來,使用的技術組件有Flume、kafka、Ftp、Sqoop、DataX等等。一些自己走的坑,主要有:a.穩定和安全,生產中首要是確保生產,不能把對端系統給搞癱了,很多時候,對端系統已經弱不禁風了,達到了各種瓶頸,如網絡帶寬,內存和CPU硬件限制等,匯聚數據稍加馬力,就要出事(曾經sqoop抽oralce生產庫,不知道對端oralce那麽脆弱,上來就猛一抽,完蛋);b.網絡復雜,跨網段的數據匯聚,很頭疼,做過幾次匯聚,網絡有N多種,公安網、視頻專網、政務網、互聯網,經過各種跳轉機和網閘等等,各種網絡限制,很可能別人鼓吹的神器,因為網絡問題,都是浮雲,c.數據質量垃圾,不敢恭維,數據能拿過來了,但是數據質量真的都不敢恭維,ETL工作做起來,殺人的心都有,d.跨部門溝通和協調問題,人的問題永遠比技術問題還要難解決,是你主動過去取,還是讓人家送過來,是你去協調別人,還是別人來找你要做數據匯聚,這是一個問題;溝通是一門藝術,coding則是一門技術。

2)存儲數據

傳統關系型數據庫,很難存海量數據,采用分布式的架構,其實分布式存儲數據並不是傳統數據庫不能解決的問題,oralce也能做到集群,mysql也沒問題,關鍵的關鍵還是如何將存起來的數據用起來,除非你真的只想做個網盤。

3)資源管理

一般公司都不僅僅是做網盤,還有挖掘,分析,產生價值,管理cpu,內存等資源,資源管理系統來管理,上百臺,千臺,分布式集群的資源管理很講究。

4)計算層

分布式程序作分析和挖掘, 分三類:批處理,交互式分析,流處理。

批處理:10T的數據如何處理,分布式的程序進行處理,講究高吞吐率,對時間要求不嚴格,分鐘或者消失級別

交互式分析:很多數據,通過語言表達查詢意圖,馬上反饋結果,支持sql,速度足夠快, 2~3秒,交互的,時間長就不是交互了,秒級;

流式處理:對時間要求很高,毫秒級處理完數據,不想批處理那樣,數據來了就處理

spark可以解決這三類問題。

5)數據分析層

偏向平臺,比較通用,銀行,電商,都可以用這些引擎來分析問題,改成和應用相關

6)數據可視化

很重要,很多創業公司在做這個,並且根據行業細分,做的都非常不錯。

spark在第四層,不做收集,資源管理,數據存儲,可視化,僅僅是一個計算框架,可以解決很多實際問題,不是大數據的全部,是數據分析技術

問題1:為什麽不采用oralce技術來實現大數據?

oralce不能解決所有的問題,l雖然oralce有load加載數據,oralce也能做做存儲,不需要做資源管理,一個節點而已,能做sql做分析,但是數據小可以,沒問題;數據大了,收集,存儲,都要拿出來做獨立模塊,各種模塊和場景都很復雜,oralce打包一起做不了。

問題2:如何實現大數據平臺?

可以自己玩,在生產中可以使用ambari或者CM這樣的部署工具來搭建大數據平臺,自己搭建和運維;也可以用別人搞好的服務,,如用阿裏雲,付錢,每個環節都實現了, 也可以google、亞馬遜,數據放在他們那裏,不安全 。在國內,屬於勞動力密集型的地方,很多企業都願意自己搭建運維,各種坑自己一個個的趟過去;而在國外,如歐洲,人力成本貴的要命,寧願花錢買別人的服務,而且他們相信專業的人幹專業的事情。

1.2 基本技能素養

大數據之所以有點學習的門檻,其實不是因為它有多難,而是要有一顆耐的主寂寞的心,有些人看到這幅圖可能就要打退堂鼓了。這些技術棧不見得非要精通,至少得用到知道怎麽百度和google,能迅速上手,基於我自己對大數據技術的理解做如下闡述,

技術分享

linux基礎:linux得入門啊,最基本的命令得會,這個沒有入門的,推薦一下老男孩的linux運維系列視頻課程

編程語言:java,scala,python

開發工具: (1) intellij開發工具,scala程序推薦該工具,eclipse對scala支持的比較差,高亮,自動提示等都比較若,(2)maven項目構建工具,好好學習一下,如何 打包測試,發布;(3)代碼管理工具git,使用git來下載和管理代碼

hadoop生態組件:hdfs、yarn、pig、hive和zookeeper等

不求樣樣精通,你不是神,根據職業角色劃分,有所側重。角色劃分我的有限理解,通常有做Hadop平臺運維、大數據ETL開發、數據建模分析、大數據可視化等等,每一個工種角色都不一樣,掌握技能側重點也不一樣。

1.3 Hadoop生態系統基礎

Hadoop生態組件是Spark的學習基礎,Spark建立在HDFS之上,是Mapreduce的改良,使用Yarn做資源調度,通過Zookeeper做主節點的HA,所以學習Spark至少也有點Hadoop的基礎。另外對於Spark有幾個言論誤解,主要有:(1)spark會取代hadoop,其實不然,他們不是不是一個量級的東西,是一個生態系統,Spark就是一個小小的組件,只是逐步替代Mapreduce編程;(2)Spark諸如強Hadoop百倍,也不全然,只能說個別場景如此,謠言止於智者。

技術分享

2.Hadoop生態基本介紹

2.1Hadoop生態組件介紹

技術分享

2.Hadoop生態基本介紹

2.1Hadoop生態組件介紹

1)HDFS和Hbase

· HDFS

分布式文件系統,它是一個高度容錯的系統,能檢測和應對硬件故障,用於在低成本的通用硬件上運行。HDFS簡化了文件的一致性模型,通過流式數據訪問,提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序。

必須要有HDFS的基礎,明白HDFS的基本架構,基本的文件管理,如block、文件、目錄等,熟悉基本的HDFS shell操作。1G數據,默認是幾個block,5個節點,這些數據會存在哪幾個節點.來自一篇論文,有13年時間了,GFS,很經典,hdfs是gfs的克隆版,google沒有開源、容錯性好,互聯網公司摳門,常常是購買x86的機器,經常掛掉,所以要容錯好;節點,機器,都是一臺服務器,【同通常配置是24個cpu,128G內存,磁盤12*3T】,2萬左右的RMB,掛掉 數據不會丟,一個文件切分成多個文件,存放在不同的節點上,一個文件多份,為並行化提供存儲的基礎,切成幾塊,並行都就是多少,【16個並行讀,16個block】

基本原理:將文件且紛成等大的數據塊block,默認是128M,存儲在多臺機器上;將數據切分、容錯、負載均衡等功能透明化;可將HDFS看成是一個容量巨大的、具有高容錯性的磁盤。

應用場景:海量數據的可靠性存儲、數據歸檔

基本架構:主從架構,主節點會做HA,數據存放在datanode。

技術分享

Hbase

HBase是一個針對結構化數據的可伸縮、高可靠、高性能、分布式和面向列的動態模式數據庫。和傳統關系數據庫不同,HBase采用了BigTable的數據模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關鍵字、列關鍵字和時間戳構成。HBase提供了對大規模數據的隨機、實時讀寫訪問,同時,HBase中保存的數據可以使用MapReduce來處理,它將數據存儲和並行計算完美地結合在一起。數據模型:Schema-->Table-->Column Family-->Column-->RowKey-->TimeStamp-->Value

2)YARN

群的資管管理和調度,在yarn上跑各種程序,spark不一定泡在yarn上,也可以mesos,甚至裸集群上,有很多分布式特點,擴展,容錯,並行

是什麽? Hadoop2.0新增的資源管理系統,負責集群的資源管理和調度,使得多個計算框架可以運行在一個集群上。

啥特點? 良好的擴展性、高可用性,對多種類型的應用程序進行統一管理和調度,自帶多種用戶調度器,適合共享集群環境。

要熟悉YARN的基本架構,各個角色的功能和交互流程,資源管理的基本方法等。

技術分享

執行流程:

a.nodemanager管理資源,將資源,有cpu,內存等匯報給resourceManager,統一管理

b.客戶client要執行任務

client查找rm->rm找nodemanager->rm找到nodemanager資源後,將資源分給client->client就直接去找nodemanager->nodemanager執行任務

3)MapReduce和Spark

Mapreduce

源自goole開源的mapreduce論文,發表於2004年12月,是google Mapreduce的克隆版MapReduce是一種計算模型,用以進行大數據量的計算。其中Map對數據集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同“鍵”的所有“值”進行規約,以得到最終結果。要掌握MapReeduce的基本編程模型,WordCount的執行流程。Spark經常和mr對比,經典的最好是了解,不要一無所知,只能說你太虛偽了。

特點:良好的擴展性、高容錯性、適合PB級以上海量數據的離線處理;分布式錯誤是一個正常現象,常態。轉為2個階段,map和reduce,就是計算機裏面的匯編語言,難用

技術分享

Spark:UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用並行框架,Spark,擁有Hadoop MapReduce所具有的優點,支持整個目錄讀取支持通配符讀取支持壓縮文件讀取,基於gz的壓縮不帶分片參數,會將每個block創建一個分片,每個分片上運行一個task支持讀取目錄中的小文件, 支持整個目錄讀取支持通配符讀取支持壓縮文件讀取,基於gz的壓縮不帶分片參數,會將每個block創建一個分片,每個分片上運行一個task支持讀取目錄中的小文件

4)Hive和Pig

Hive:由facebook開源,最初用於解決海量結構化的日誌數據統計問題。Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化為MapReduce任務在Hadoop上執行。

通常用於離線分析。

Pig:由yahoo!開源,設計動機是提供一種基於MapReduce的ad-hoc(計算在query時發生)數據分析工具定義了一種數據流語言—Pig Latin,將腳本轉換為MapReduce任務在Hadoop上執行。

通常用於進行離線分析。

5)Oozie和Zookeeper

Zookeeper:源自Google的Chubby論文,發表於2006年11月,Zookeeper是Chubby克隆版解決分布式環境下的數據管理問題:統一命名,狀態同步,集群管理,配置同步等。

6)Flume和sqoop

Sqoop是SQL-to-Hadoop的縮寫,主要用於傳統數據庫和Hadoop之前傳輸數據。數據的導入和導出本質上是Mapreduce程序,充分利用了MR的並行化和容錯性。

Flume:Cloudera開源的日誌收集系統,具有分布式、高可靠、高容錯、易於定制和擴展的特點。

它將數據從產生、傳輸、處理並最終寫入目標的路徑的過程抽象為數據流,在具體的數據流中,數據源支持在Flume中定制數據發送方,從而支持收集各種不同協議數據。同時,Flume數據流提供對日誌數據進行簡單處理的能力,如過濾、格式轉換等。此外,Flume還具有能夠將日誌寫往各種數據目標(可定制)的能力。總的來說,Flume是一個可擴展、適合復雜環境的海量日誌收集系統。

7)Ambari

由hortworks開源,是一種基於Web的工具,支持Apache Hadoop集群的供應、管理和監控。Ambari目前已支持大多數Hadoop組件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。1000個機器,如何部署,拷貝數據都考死人,自動化安裝工具ambari,點擊鼠標自動安裝,修改配置,啟動服務。

目前來說,只有可視化功能,hadoop生態系統沒有提供,

2.2 Hadoop計算框架介紹

通常來說,計算引擎的分類,

1)批處理:對時間沒有嚴格要求,離線分析,不關系時間,關註吞吐率

2)交互式:支持sql,對數據進行快速分析,人機交互,時間要求高

3)流式處理:流水一樣流入系統,實時分析,來一條處理一條。對每一條數據時間要求高,吞吐率要求不高

4) 叠代式與DAG計算:機器學習算法,離線分析

當然有些公司也有自己的劃分方法,比如hortworks(已經上市了的大數據公司),劃分方式:

用時間來劃分0~5秒實時分析,和其他公司劃分就不一樣,比如在線查詢有些公司要求毫秒,作為參考而已

技術分享

hortworks將計算框架也劃分了幾類

簡單批處理:MapReduce和hive

DAG與叠代式: tez逐步替代hive,Spark替代shark,簡單批處理和DAG叠代式都是離線分析

交互式框架:Impala,Presto

流/實時計算:Stoam,Samz,Spark Streaming

技術分享

涵蓋三類應用場景,如果spark能解決的就用spark把,Spark架構如下

技術分享

1)計算框架

分布式,基於內存,彈性

2)數據存儲

在hadoop生態系統,如hdfs,hbase,分布式存儲引擎

3)資源管理

由yarn管理,或者mesos等,有一個內核,spark core,在這之上,構建了很多計算引擎,方便用戶編寫

4)spark sql

寫sql,將sql轉為spark程序

5)spark streaming

6)graphx:圖計算

7)MLLib:機器學習,通用的機器學習算法,聚類,分類,避免重復造輪子

8)Spark R:用r語言寫spark程序

Spark不是一門孤立的技術,社區很活躍,支持linux和windows;微軟怕被淘汰,給大數據社區貢獻了一些windows運行的patch,但依然很少有人用,spark不斷在發展過程中,版本的升級都是內核變動,api層很少變動,一般不會該使用和優化為主,

技術分享

3.Spark概述

3.1 Spark出現的技術背景

1)Mapreduce的局限性

mapreduce框架的局限性主要表現在

· 僅僅支持map和reduce兩種操作

· 處理效率低(中間結果寫磁盤,多個mr之間通過hdfs交換數據;任務調度和啟動開銷大;無法充分利用內存,不管什麽操作map和reduce都要排序),為什麽寫磁盤,因為當時磁盤便宜,內存貴,現在內存很便宜。

· 不適合做復雜的計算,如叠代計算,如機器學習圖計算、交互處理和流計算。

· 編程不靈活,基本就是分布式編程界的匯編語言。

2)各種計算框架多樣化

spark之前,很多,各種框架部署和管理都比較亂,spark可以同時解決這三種場景,學習一類解決三類問題,寫程序和管理都很簡單。 現有的各種計算框架各自為戰,批處理mapreduce、Hive、Tez,流式計算storm,交互式計算Impala,Spark同時處理批處理、流計算、交互式計算等。

3)Spark特點

· 高效:快10~100倍,取決於邏輯和具體的計算,內存計算引擎,提供駕馭內存的機制,靈活利用內存,DAG的計算楊引擎,減少開銷,使用多線程,減少啟動開銷,shuffle減少不必要的開銷和磁盤IO。

· 易用,非常豐富的API,支持JAVA,scala,pyhon,R四種語言,spark之前,scala很小眾

spark帶動scala的銷量,scala代碼少2~5倍,更短,出錯更少,

·與hadoop集成的很好,和yarn很好的集成

給人更多的選擇,你不喜歡可以使用mr,我比mr更快,你自己看著辦,如下面的sql語句, mapreduce程序啟動就會有4個mr,並且讀寫hdfs非常頻繁,效率很低;而使用Spark,DAG模式大大節省磁盤IO。

在一個統一的框架下,進行批處理、流計算、交互式計算

技術分享

3.2 Spark核心概念介紹

1.RDD彈性分布式數據集

· 數據集的抽象,以前學過很多數據集,array,list,map數據集等,抽象成不同的數據結構,

分布式:數據被分解成很多塊放到不同節點

彈性:相對於存儲介質而言,可以放在磁盤,可以放在內存,這就是彈性的意思

· 分布在集群上,只讀

一個RDD被分解成很多塊partition,這些partition分布在不同的機器上。多個partion組成,hdfs的block有什麽關系,2套術語,都叫塊不可以,2個團隊2個社區的人,命名方式不同了。

· 可以在內存或者磁盤上

· 可以並行的構造,一個或者2個可以產生新的

· 失效後,自動重構

技術分享

2.基本操作Transfoation和Action

rdd是數據,有數據,就有計算操作,基本操作分成2類(為什麽分成2類),

1)transformation:一類算子的簡稱,完成轉換功能,函數和算子一個意思,看成一個大的數組,裏面有元素,被切分放到各個節點上。

2)action:把rdd變換成一個或者一組值,這些是單機的,前面transformation都是分布式的值,

技術分享

3)Spark提供了大量的函數

transformation:參數也是函數,輸入T類型rdd,輸出U類型也是RDD,

aciton:輸入rdd,輸出不是rdd了,可能是基本類型或者數組等,都是單機的類型

技術分享

4)惰性執行

transformation只會記錄RDD的轉化關系,並不會觸發計算

action是觸發程序執行(分布式)的算子

技術分享

3.緩存cache和persist

spark非常好的能力,能控制內存的使用量,就是通過cache和persist實現,稱為控制語句

可以讓rdd cache到內存或磁盤上。

問題: cache和persist 區別(面試會經常被問到) ,回答以下知識點

(1)cache和persist都是用於將一個RDD進行緩存的,這樣在之後使用的過程中就不需要重新計算了,可以大大節省程序運行時間,

(2) cache只有一個默認的緩存級別MEMORY_ONLY ,cache調用了persist,而persist可以根據情況設置其它的緩存級別。

(3)executor執行的時候,默認60%做cache,40%做task操作,persist最根本的函數,最底層的函數

技術分享

storagelever每個等級有5個參數

·是不是用磁盤

·是不是不內存

·是不是用tacyon

·是不是反序列化

·緩存保存多少份

序列化器,使用序列化節省內存但是消耗cpu,拿出來的時候要進行反序列化,缺省的,用自帶的,但是性能很差,根據自己的需求是否進行序列化,不要用自帶的序列化器

4.Spark運行模式

4.1.Spark程序組成

1)程序執行

· spark-shell,讀取文件->RDD轉換-> RDD觸發執行->保存結果

技術分享

· spark-submit,很多參數,註意下參數:--master,指定程序運行的模式,可以本地,yarn,別的集群上

技術分享

2)Spark程序架構

技術分享

2個組件組成,application = driver(1個)+ executor(多個)

· driver:main函數,2g內存1個cpu,運行指定將相應的jar包和文件傳給work node

· application:driver+executor,spark應用程序,2個應用程序是沒有任何關聯,如果共享數據只能hdfs或者tacyon. executor運行是指定,可以同時跑幾個task,一個application轉為多個task(driver轉化),task扔給exe執行,

4.2.Spark程運行模式

1)本地模式

不一定非要跑在hadoop集群,可以在本地,起多個線程的方式來指定。將Spark應用以多線程的方式直接運行在本地,一般都是為了方便調試,本地模式分三類

· local:只啟動一個executor

· local[k]:啟動k個executor

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

2)獨立模式

搭建一個集群跑,分布式環境中執行spark程序,資源管理和任務監控是Spark自己控制。

技術分享

3)集群模式

技術分享

driver運行在本地,沒有容錯,但是調試方便

技術分享

driver運行在集群裏面,yarn從slave裏面選擇一個跑driver,有個好處就是當driver掛掉了,resourceManager可以重新啟動一個driver,實現容錯,生產環境使用的模式。

5.參考資料

1.http://blog.csdn.net/woshiwanxin102213/article/details/19688393 Hadoop生態系統介紹

2.董西成ppt

【Spark深入學習-11】Spark基本概念和運行模式