Spark生態圈

目錄

*Spark概述及其特點

*Spark產生背景

*Spark發展歷史

*Spark Survey

*Spark對比Hadoop

*Spark和Hadoop的協作性

No.1 Spark概述及其特點

1、性能強大的分散式計算框架。

  • apache spark提供了一個更高級的DAG(有向無環圖)的執行引擎,這個執行引擎支持數據流處理和內存的數據計算。
  • 他可以結合SQL、streaming和一些其他複雜的分析操作,放在一起進行操作。spark上可以有spark sql、spark streaming、MLlib(machine learning)、GraphX(graph)
  • spark提供一個棧,包括SQL、DataFrames、MLlib的包,還有Graphx,可以在一個應用程序裡面將這些包無縫對接,一站式解決不同場景的業務!
  • spark能夠運行在hadoop之上還能運行在mesos、standalone之上。它可以訪問各種數據源,包括hdfs、hbanse、Cassandra、S3這些都可以進行訪問。其實這一點對於公司的技術選型是非常重要的。

2、apache spark是一個快速、通用的引擎,適用於大規模的數據處理。

  • mapreduce 中都是以進程的級別進行的(map -> reduce),啟動和銷毀都需要一定開銷的,而spark是基於線程的,是有線程池的,用的時候在線程池裡面拿線程,用完以後再把線程丟回線程池,以供後面的作業繼續使用,所以這種基於線程模型的對於任務的開銷肯定是小很多的,肯定要比mapreduce和hadoop基於進程的要小不少的!
  • 可以快速的用java、Scala、python、R開發我們的應用程序。spark提供超過80個高級別的api,在mapreduce中,我們只有map和reduce兩種運算元,但在spark中會有很多,可以讓我們更加容易的構建我們的應用程序,而且還能啟動一些命令行的交互語言。
  • 如果數據在內存上面,速度比mapreduce快100個數量級,數據在磁碟上要比mapreduce快10個數量級。

No.2 Spark產生背景

1、mapreduce的局限性

  • 通過wordcount來看,mapreduce做wordcount是非常繁瑣,我們可以看官網,mapreduce實現一個wordcount的過程,如下圖,非常繁瑣!代碼量也很多。一個簡單的詞頻統計要這麼複雜,效率還是比較低的。而且他只能支持map和熱度測方法

  • 不適合迭代多次、互動式、流式的處理。這是什麼意思呢?比如迭代多次典型的在機器學習裡面以及圖計算,這要對數據進行很多次的迭代的,那麼在mapreduce是基於磁碟的,這裡他會寫很多磁碟,所以效率不怎麼樣。互動式也是不合適的,還有流式的處理,這是什麼概念呢?就是你數據輸入過來,就要立馬給他消費掉,給它處理掉,但是mapreduce處理的數據是靜態的,是不能變化的,所以他是不能進行流式的處理的。這幾個就是mapreduce局限性的一個體現。

2、框架多樣化

  1. 批處理(離線處理):mapreduce、hive、pig
  2. 流式處理(實時處理):Storm、JStorm
  3. 互動式計算:Impala

假設你們公司既要批處理又要流式處理還需要互動式計算,那你們需要搭建多少個集群啊?這對於公司的成本來說,簡直是太高了!為什麼這麼說,你作為一個研發人員,你要處理這麼多的集群、框架,你肯定都得去學習這些框架到底是怎麼用的,你學會以後你要在環境上搭建出來,這無形中又增加了運維的成本!這就是框架多樣化帶來的問題,你要配置多套集群,你要根據不同的框架進行學習,那麼mapreduce的局限性和框架的多樣化就是我們spark產生的背景,在spark中可以包含批處理和流式處理以及互動式計算。

No.3 Spark發展歷史

No.4 Spark Survey

上圖可以看出,spark真的是一個非常活躍的項目,從spark的貢獻和參與峰會的數量都在快速增長。我們再看看spark在那些行業用的比較多。

其實這張圖以及概括了我們生活的方方面面了,我們再繼續細化一下!

我們在看看spark在哪些業務場景裡面使用的最多呢?

這張圖BI場景68%,數據倉庫52%,日誌處理40%,面向用戶服務36%,推薦系統44%,欺詐系統和安全保障29%以及其他12%,其實這些也是涉及到我們的方方面面的,比如電商,你在網上買了一hadoop的本書很可能下次給你推薦了spark相關的書籍,這些就是推薦。還有現在日誌處理也是非常多的,大部門公司都有自己的日誌處理系統。

然後我們再看一下大家對spark的關注點有哪些呢?

91%的人認為選擇spark是看中他的性能,77%的人看中的是易於編程的特性,因為可以選擇自己熟悉的語言開發,71%的人看中的是他的易於部署,因為我們可以跑在hadoop上面(就是yarn上面)以及其他的比如mesos之上,64%看中的是更加高級的一些分析操作,52%的人看中的實時的流處理。

從2014和2015年的數據來看,spark streaming的用戶增加了56%,python的用戶增加了49%,windows窗口的操作增加了283%,這個增長速度是非常驚人的!

我們再來看看對於spark環境部署方面的一個調查。

48%的人選擇的是standalone模式,40%選擇yarn,11%選擇的是mesos,這個調查參與人數大部門其實是美國灣區那邊的,其實如果對於我們的國內的用戶做一個調查的話,yarn是最多的,還有51%的用戶是吧spark運行在公有雲之上的,我們再來看看什麼樣的角色的人在使用spark呢?

41%的人是數據工程師,22%的人是數據科學家,因為spark餓用戶說白了也就那麼幾類人,但是spark打破了我們技術的障礙,讓數據工程師和數據科學家之間解決協同工作,用來解決我們的數據問題。我們再來看看大家使用spark的組件有哪些呢?

69%的人選擇sparksql,62%選擇DataFranmes,58%選擇MLlib+GraphX,48%選擇Streaming,還有75%使用兩個或是更多的spark組件。一般都是組合起來使用的,還有51%用戶使用三個或者三個以上的組件,使用這些組件可以幫助我們一站解決問題。

我們再來看一下使用spark的用戶群體當中,選擇的開發語言。

58%的人選擇python,31%的人選擇java,71%的人選擇Scala,36%的人選擇SQL,還有18%選擇R語言,這裡有個問題,當時15年調查的時候,spark里的R語言支持剛剛推出不久,現在其實R語言增長的已經非常的多了!左邊還有一下關注的spark特性,64%的人關注高級分析操作,47%的人關注DataFrames,52%關注streaming,28%關註標準的SQL支持。

No.5 Spark對比Hadoop

1、hadoop生態系統

首先我們看看這張hadoop生態圈的圖

這是我們工作當中常用到一些hadoop生態圈的一些框架。

底層就是hadoop的分散式文件存儲系統HDFS,在這之上是YARN和MapReduce,yarn就是一個分散式資源管理和調度的框架,mapreduce是一個分散式計算框架。

yarn之上是hive,hive是facebook開源的用於解決海量結構化日誌的一個統計的方案,構建在hadoop之上的一個數據倉庫, hive其實很簡單,就是把我們的sql語句轉換成mapreduce作業把她提交到我們的集群上運行就行了,因為我們剛剛看到,使用mapreduce開發一個wordcount的話需要很多代碼,也很繁瑣,如果一些同學不熟悉java,那怎麼辦呢?我們就可以使用hive,因為hive提供的SQL,只要SQL就可以完成統計分析。

再來看看R語言,R語言也是經常用來做統計分析的,還有Mahout,他是hadoop生態系統當中的一個機器學習的框架,他的目的是為了快速構建我們可以擴展的高可用的機器學習環境,當然現在Mahout已經停止對mapreduce的更新了,他慢慢的也是轉向對spark的支持。

再往左邊看是小豬Pig,他是一種腳本性的語言,他是由Yahoo開源的,他的功能也是一樣,把Pig語句轉換成mapreduce作業,跟hive是非常非常類似的,但是近幾年Pig的使用場景已經很少了。

再往左邊是Oozie,這是一個工作流引擎,比如a工作執行完才能執行b工作,把工作執行完才能執行c工作,那麼a和b和c這個時間順序我們可以用Oozie管理起來。

再往左邊是個Zookeeper,它是一個分散式的協調服務,比如hdfs裡面的namenode他的ha以及hbase裡面master的ha,都是通過Zookeeper完成自動切換的,當我們的主節點掛了也沒關係,Zookeeper能夠選擇一個從節點並將其切換成主節點,對這個過程我們是不感知的。

再往左邊看,下面是flume是日誌的收集框架,flume可以從其他的應用程序產生的日誌中給他收集過來,並可以把他放到我們的hadoop集群之上,這個用的還是很多的,特別是流處理這一塊,或者離線處理這塊也有。

上面是Sqoop,這是一個數據交換的一個工具,比如你原來的數據實在關係型資料庫當中,現在關係型資料庫以及存儲不了那麼多的數據,你想把這一部分數據使用hadoop或者是大數據的一些分散式計算框架進行計算,你要做的第一件事情就是要把你關係型資料庫裡面的數據抽取到hdfs上面來,這就可以使用Sqoop來完成,還有你在數據平台上進行統計和分析,你的執行結果你想導入到mysql或者oracle等等的關係型資料庫當中去,你也可以使用Sqoop完成這個功能。

再看看最右邊的Hbase,他其實就是部署在hdfs上得一個分散式的列存儲系統,你可以理解會他就是大數據當中的資料庫,功能也是很強大的,適用于海量的數據存儲和查詢,如果你的Hbase rowkey或者說主鍵設計得好的話,他的查詢速度是非常快的。

好了,那麼以上這張圖就是hadoop生態系統在我們工作當中用的比較多的框架或者組件。

2、Spark對比Hadoop:BDAS

Spark生態系統有一個簡稱叫做BDAS,那麼什麼叫做BDAS?BDAS其實就是Berkeley Data Analytics Stack的簡寫。

我們看下圖。

這個stack裡面有什麼呢?我們看最下面mesos,你可以理解為這就是一個分散式的資源管理調度框架,和yarn類似,在往上有HDFS,S3,這些都是分散式的存儲系統,這張圖有幾種不同的顏色,灰色表示的是外部相關的系統,也就是說嚴格意義上不屬於BDAS。

再往上看是Tachyon現在已經改名為Alluxio,這是一個分散式的基於內存的一個存儲系統,HDFS是存儲在磁碟上的,而有了Alluxio之後,數據的讀寫是要快很多的。

在Alluxio之上有Spark,Spark是一個快速的基於內存優化的執行引擎,我么可以使用java、Scala、python等api進行維護。這其實就是Spark core,對於這個Spark core之上對於不同的應用場景又開發了不同的自模塊,比如Spark streaming,這是用來做流處理的。比如GraphX,它是用來做圖計算的,MLlib是用來做機器學習的,還有SparkSQL是用來完成sqlAPI的一些操作。

那麼這些深色的塊都是已經能用的,還有一些灰色的比如hive,storm,mpi這些都是外部的,

比如這個storm和我們spark是沒有關係的,要用的話肯定要搭建環境的,,而比如Spark streaming是在Spark之上的,根本不需要搭建任何環境就可以直接使用。

還有一個最頂上的BlinkDB,這是一個用於在海量數據之上的運行互動式SQL查詢的一個大規模的查詢引擎,他也是類似於SQL的,不過他這是通過犧牲數據的精度來提升我們查詢的響應時間,也就是說如果你允許你的數據誤差在某一個範圍之類,那麼使用BlinkDB是可以提升我們的查詢效率的,這個用的不是太多,重點就是基於Spark之上的這些個框架。

以上就是BDAS。

3、Spark對比Hadoop:Hadoop生態圈對比Spark BDAS

  • 對於批處理的場景來說(Batch processing),在 Hadoop里我們可以使用mapreduce,當然也可以用hive,pig都是可以的,在Spark中呢,我們可以用RDD操作,也就是Sark core來操作,它能夠支持java、python、Scala的api
  • 對於第二個場景SQL查詢來說(SQL querying)在hadoop中我們可以使用hive,在Spark中我們可以使用Spark SQL,如何從hive平滑的過渡到sparkSQL,我們下面再說。
  • 第三個場景對於流式處理或者實時處理來說,在 Hadoop中通常使用kafka對接storm,在Spark中使用Spark streaming,當然streaming也是可以和kafka整合起來使用的。
  • 第四個場景是機器學習,在hadoop中可以使用Mahout,但是Mahout對mapreduce的支持已經不更新了,在Spark中有單獨的一個框架 MLlib。
  • 第五個場景對於實時數據的查詢或者查看呢?在hadoop中我們可以使用Hbase或者Cassandra等NoSQL的資料庫,而在Spark當中,他是沒有相應的組件的,但是對於NoSql資料庫來說Spark可以查詢數據,使用sparksql的外部數據源或者使用spark core裡面的api都是可以進行快速的訪問的。

我們再回顧一下spark官網上的一句話,它是一個快如閃電的分散式計算框架,所以說它是一個分散式的計算框架,他是沒有存儲的東西,spark存儲東西可以存儲在hdfs上、關係型資料庫上都是可以的,但是這一部分已經不屬於 spark範疇裡面了,好了,以上就是hadoop和spark生態圈的一個對比。

4、Spark對比Hadoop:Hadoop對比Spark

這裡我們對比hadoop和spark本身。

  • 我們先看hadoop,那麼hadoop是有哪些構成的呢?第一個分散式的存儲系統也就是HDFS,分散式計算框架也就是mapreduce。當然還有一個就是分散式的資源管理,就是yarn。在spark當中僅僅有一個分散式計算框架,並不關心你從哪裡讀取數據。
  • 第二個在hadoop中,他的計算引擎,計算框架是採用的mapreduce的編程模型,你要按照mapreduce的編程模型來實現你的map方法和熱度測方法,在 saprk中是一個通用的計算,有不同的場景,比如有流處理,或者機器學習,他都有對應的解決方案。
  • 在 Hadoop當中通常數據是存放在磁碟當中的,或者說存放在hdfs上面,那麼在spark上,數據既可以存放在磁碟上也可以存放在內存中,而且還可以內存和磁碟都存,而且還可以存多份!這個就是我們的存儲策略設置一下就好了。
  • 在 Hadoop中那種迭代式互動式的工作或者作業,他並沒有很好的解決方案,因為你的迭代次數越多意味著你中間數據的落地就越多,一落地這個性能就會差一些(落地數據:就是被持久化的數據,這種數據一般放在硬碟或是其他的持久化存儲設備里,例如:圖片、系統日誌、在頁面上顯示的數據以及保存在關係資料庫里的數據等等,落地數據一定會有一個固定的載體,他們不會瞬時消失的。不落地數據:一般指存儲在內存或者是網路傳輸里的數據,這些數據是瞬時,使用完畢就會消失,例如:我們在瀏覽器發送給伺服器的請求;從資料庫讀取出來的一直到頁面展示前的數據等等。「不落地」傳輸能夠滿足用戶在性能上的要求。)。但在spark中,他是非常擅長這種工作,為什麼呢?因為他有DAG執行引擎,他中間是不用落地的。所以他在機器學習和圖計算當中性能是非常不錯的。
  • 對於hadoop來說,他是一個批處理的執行引擎,但是對於spark呢?他既可以做批處理也可以做流處理,也可以做機器學習等等。使用spark和mapreduce他的批處理引擎他的執行效率對比,如果數據是在磁碟上,能快2~10個數量級,而在內存上可以快100個數量級。
  • 在語言上,spark支持java、scala、python。而在hadoop上一般使用java

5、Spark對比Hadoop:MapReduce對比Spark

我們在看看mapreduce和spark的對比,我們對比的層次是越來越低的,先從生態系統對比,再從框架對比,再從子框架進行對比,我們先來看一張圖。

假設你的數據存放在Input當中,你如果要進行mapreduce處理的話,首先要從hdfs上把你的數據讀進來,iter 1就理解為mapreduce的作業1,處理完了之後,要把結果寫到hdfs上面去,就是那三個綠色的桶,因為一般生產上是三副本,如果下一個作業以上一個作業的輸出做為輸入,那麼又要從HDFS把上次輸出的數據讀取進來,然後再進行相應的迭代處理以後再給他寫回到HDFS裡面去,以此類推......中間是有數據的落地的,而去多個作業之間的數據共享只能藉助於HDFS來完成,這是mapreduce的,那麼如果是spark是什麼樣子的呢?

對比兩張圖其實看出來就是把磁碟換成了內存而已,讀取一樣從hdfs上面讀取數據,讀完以後寫到內存上面,下一個作業要執行的話從上一個介面讀取進來就可以了,這樣中間就減少了很多數據的落地,那麼這樣對於序列化對於磁碟網路的開銷都是有很大的提升的,那麼hadoop和spark的一個對比我們就寫到這裡了。

No.6 Spark和Hadoop的協作性

*Hadoop的優勢

  1. 看上面這張圖,第一點是數據規模方面,hadoop是一個可以進行水平橫向擴展的組件,對於HDFS來說存儲空間不夠了你可以添加機器的方式來擴展,如果說你的計算能力不夠了,你可以擴展resource manager和node manager來擴展,並且可以支持多種數據源多種應用和多用戶。
  2. 第二個他是企業級的平台,既然是企業級的平台,我們就要保證他是高可靠的,而去能夠是多租戶的,是有安全性的。
  3. 第三點他的應用範圍比較廣,他可以處理文件的數據,也可以處理資料庫的數據,而去它還能夠支持半結構化的文件。

*Spark的優勢

  1. 這個優勢我們之前其實也有講過,第一點易部署易使用,他的API比較容易使用,提供了80多個高層次高級別的api,使得我們開發應用程序能夠非常非常的方便。
  2. 能夠支持python,java,Scala和R語言。
  3. 它是一個內存的計算框架,它能夠通過RDD的方式進行編程,而去統一的採用DAG的處理模式。
  4. 它能夠綜合多個不同的子框架進行使用,比如這裡有個shark,shark可以理解為就是sparksql的一個前身,還有machine learning,還有streaming還有GraphX,能把這些一起配合起來使用,從而達到一站式解決不同場景的問題。

*Hadoop + Spark

如果我們把Hadoop和Spark結合起來,那就完美了!能夠使我們的應用程序通過在內存中進行計算,使得計算效率得到很好的提升,如果這麼做就完美了!那麼在工作上,是什麼樣的一個結構呢?我們再看下面一張圖。

我們在工作中,數據是存儲在hdfs之上,也就是說存放在hadoop之上的。

那麼在上面一層的yarn,也就是資源的管理和調度,我們不管是mapreduce作業還是spark作業,我們都統統跑在yarn之上,使用一個集群裡面,也就是一個yarn集群來進行整個數據平台的作業的資源管理和調度。

在這個yarn之上有批處理,我們可以跑mapreduce,有流處理,我們可以跑storm和S4,我們也可以將內存式的計算比如spark跑在yarn之上。

這樣子的話就非常方便了,從這張圖我們也能夠體會出來一點,hadoop和spark在生產上面是相輔相成的,各自的模塊負責各自的功能,在hdfs之上存數據,在yarn之上進行資源的管理和調度,然後你的分散式計算引擎比如說spark或者說是storm或者mapreduce你可以跑在yarn之上,這樣子的話就非常完美了!

好了,到此Spark生態圈就寫到這裡啦


推薦閱讀:

一塊石頭存在的意義是什麼?
Pandas: 如何將一列中的文本拆分為多行?
淺談C5.0與CART演算法的比較--理論理解
從小白到演算法工程師,這是我的學習求職之路

TAG:数据分析 | 数据挖掘 | Scala |