Spark從入門到放棄——初始Spark(一)

╭⌒若隱_RowYet發表於2020-12-09

Spark版本

  Spark是Apache開源的頂級專案,官網地址,目前也一直不斷更新迭代,截至本部落格釋出時間(20201202)最新版本是Spark 3.0.1 released (Sep 08, 2020),因為公司目前生產用的是Spark2.3.3,所以後續的教程都是以Spark2.3.3為主;

   講解版本:Spark2.3.3

什麼是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.

  以上是Spark官網原話,翻譯翻譯就是Spark是一個計算快並且通用的叢集計算系統。它提供了Java、Scala、Python和R的高階api,以及一個支援有向無環圖執行的優化引擎。它還支援一組豐富的高階工具,包括結構化資料處理的SparkSQL、用於機器學習的MLlib、用於圖形處理的GraphX以及實時流計算的SparkStream
  Spark的各個元件參考圖1,接下來我們先簡單依次介紹它們;
在這裡插入圖片描述

圖1 Spark軟體棧

Spark Core

  Spark Core即Spark核心,實現了Spark的基本功能,包含任務排程,記憶體管理,錯誤恢復,與儲存系統互動等等模組,Spark2.X後核心提供了兩組最常用的API定義,即Low-Level APIs常用的代表有RDDsDistributed Varibales,當然RDDs在Spark1.X就有了,全稱Resilient Distributed Dataset(彈性分散式資料集),表示分佈在多個計算機節點上可以並行操作的資料元素集合,是Spark主要抽象;另一組API是Structured APIs,主要代表有Datasets, DataFrames , SparkSQL,而三者間又有必然的聯絡,因為這些API主要是用來處理結構化資料的,所以通常情況下, SparkSQL讀取進來的資料,預設就是一個 DataFrames,而 DataFrames又是特殊的Datasets,區別就在於,Datasets沒有列的概念,即資料是一行一行的, DataFrames有明確的列名,就類似與一張關係二維表;詳情後續我們再談;

  總之,建立和操作這些資料集合的API都是由Spark Core提供的;

Spark Streaming

  Spark Streaming是Spark提供的對實時資料流失處理的模組,比如網頁伺服器的日誌,網頁使用者行為埋點日誌收集,Spark Streaming提供運算元據流的API,並且和Spark Core中的RDD API十分相似,也一樣的支援容錯和彈性,這樣只要你學好了RDD的API,就能輕鬆應對記憶體或者磁碟的離線計算,也能運用自如實時資料流;

MLib

  MLib,全稱Machine Learning library(機器學習程式庫),提供常用的機器學習演算法,包括分類,迴歸,聚類,協同過濾等等,同時也支援模型評估,資料匯入等功能,另外,MLib還支援更底層的機器學習原語,包括一個梯度下降的優化演算法,因此在叢集上可以輕鬆的伸縮;
  此項為專業的機器學習提供,一般行業資料計算較少接觸到,除非涉及資料的演算法訓練;

GraphX

  GraphX顧名思義,就是處理資料結構圖的程式庫,如社交網路的朋友關係,進行圖的平行計算,是對Spark RDD API的一種擴充,支援對圖的各種操作,如進行圖的分割subgaraph和操作所有的頂點mapVertices;以及一些常用的圖演算法,如PageRank;
  此項為專業的圖計算人員提供,一般行業資料計算較少接觸到;

Spark執行模式

  目前Spark執行的常用模式有以下幾種,開源學習的話,建議學習Spark on Yarn模式;

  1. 本地執行模式,即local模式,常用於程式單機測試;
  2. 獨立執行模式,即Standalone模式,採用Spark自帶的資源管理器的一種主從結構,常用於測試以及臨時資料處理;
  3. Spark on Yarn模式,即採用Yarn作為Spark的資源管理器,同時Spark on Yarn又分為兩種模式,Yarn的倆種模式:一種為 client;一種為 cluster,可以通過- -deploy-mode 進行指定,也可以直接在 - -master 後面使用 yarn-client和yarn-cluster進行指定,倆種模式的區別:在於driver端啟動在本地(client),還是在Yarn叢集內部的AM中(cluster);其中Spark on Yarn 的cluster模式應該是國內開源用的最多的模式。
  4. Spark on Mesos,即採用Mesos作為資源管理器,在國外用的比較多,相對於Yarn,Mesos較為細力度一點,Yarn是當你申請了一份資源(包含CPU,記憶體等)後,即使後續實際沒有用到這麼多資源,也不會做處理,Mesos則是如果後續使用到的資源沒有這麼多,則可以回收一部分;
  5. Spark on EC2,EC2則是亞馬遜雲的資源管理的應用系統,屬於商業軟體;
  6. 其他模式,一些雲產品的自己的產品,其實底層都是Yarn和Mesos的影子;

Spark支援的檔案系統

  Spark支援任何hadoop分散式檔案系統(HDFS)的檔案為分散式資料集,但是hdfs並非Spark的必要條件,它也支援實現了hadoop介面或者類似介面的檔案系統,如hadoop的 hive,hbase;國人的驕傲Tachyon分散式檔案系統;雲產品(二次開發的hdfs),如Amazon S3,AliYun OSS等,當然,也支援本地檔案;
  當然,對於開源學習來說,建議學習Hadoop系列的檔案系統,常用的hdfs檔案,hive,hbase和spark的互動還是很緊密的,spark支援的常用hadoop輸入格式包括txt,json檔案,csv檔案,SequenceFile,Avro,Parquet,Orc等,一般正式環境用Parquet比較多,也是spark運算完後生成檔案的預設格式;

  以上就是Spark的功能模組和核心元件,當初,Spark的偉大夢想,一站式解決計算的所有,一開始不被人看好,現在基本都實現了,結構資料的spark sql,dataframe,dataset,rdd等批處理,流式計算的spark streaming,機器學習MLib以及GraphX,以及目前仍在擴建的生態圈,可以說是非常的成功的專案;

Spark與其它計算框架的對比優缺點

  一項技術的興起,必然是革了另一項技術的命或者是在某一領域有了重大突破了,單純討論一項技術的優缺點,難免有些閉門造車,自吹自擂,這裡就簡單聊聊spark和其他常用的計算框架的對比,看看她究竟革了誰的命,又有沒有可能將被誰革命;

  • 優點:人如其名,spark,像星火一樣一閃而過,就計算完成了,這裡說的其實是對比與Hadoop MapReduce,Spark的誕生正是因為當初加州伯克利大學RAD實驗室一些研究人員覺得MapReduce在迭代和互動計算時效率低下,縱觀全球又沒有更好的產品,於是就自己寫一個吧而誕生的,spark拋棄了MapReduce反覆落地磁碟互動的裡面,採用記憶體計算的裡面,加上有向無環圖(DAG)的加持以及高效的容錯機制,使得相比於MapReduce有10~20倍的提升,極端情況下還有100倍的提升(具體可參考官網主頁吹牛逼的圖片,哈哈)!

在這裡插入圖片描述

圖2 spark運算速度宣講(極端情況下)
  • 優點使用簡單:寫過MapReduce都知道,那東西還真不是一般人寫的,每次實現一個功能,都要繼承Mapper類,重寫map方法 ,繼承Reducer類,重寫reduce方法,再自定義JobRun類在main函式去呼叫這些,運算元單一,只有map,reduce,遇到複雜的計算,只能反覆用這兩個運算元;而spark則不同,rdd運算元豐富,組合方便,採用語法糖的scala語言或者python寫的話更是簡簡單單,java稍微難一點,因為java不支援匿名函式,需要定義匿名內部類去重寫該類的匿名函式;

  以上是優點是針對MapReduce的,有人說MapReduce不是後續也有hive的出現,使用hivesql可以代替MapReduce寫的繁瑣嗎?一樣的spark也有sparksql,總體還是快於hivespark,因此可以基本說spark rdd革了MapReduce的命,sparksql革了hivesql的命,注意不是革了hive哈,hive本身作為後設資料管理還是很好用,目前也還在使用中。

  • 缺點 流式計算的瑕疵:總體而言,spark在離線資料或者近線資料領域,大資料量處理也遊刃有餘,但是spark的流式計算採用Micro-Batching理念,即流是批的特例,因此流式計算就是微批處理,資料一小批的不斷處理,這種理念能解決99%的流式計算,有個致命的缺點,那就是這種理念必須要攢批,一次必然存在攢批的時間誤差,因此剩下的1%的難題,被Native-Streaming裡面解決,認為批是流的特例,批處理只不過是個有界的流處理,即有結束的流式處理,因此此領域,spark正在受到衝擊,以對手flink為主,當然flink的批處理還沒有spark那麼穩定;
    在這裡插入圖片描述
圖3 流批的本質

`

Spark簡史

  目前spark早已經是Apache的頂級專案,這裡就記錄一些大的變更吧,具體有興趣的可以官網的新聞頁:http://spark.apache.org/news/index.html;

  • 2009年作為研究專案在加州大學伯克利分校RAD實驗室(AMPLab的前身)誕生,主要是解決Hadoop MapReduce在迭代和互動計算上效率低下的問題;
  • 2010年3月開始開源;
  • 2011年AMPLab開始基於spark開發更高層的元件,擴充套件生態圈,如shark(spark sql的前身),spark streaming等;
  • 2013年6月,Spark接受進入Apache孵化器
  • 2013年12月,Spark 0.8.1釋出支援Scala 2.9,YARN 2.2,Standalone部署模式下排程的高可用性,shuffle的優化等;
  • 2014年02月,Spark 0.9.0釋出增加了GraphX,機器學習新特性,流式計算新特性,核心引擎優化(外部聚合、加強對YARN的支援)等;
  • 2014月05月,Spark 1.0.0釋出,增加了Spark SQL;
  • 2015年03月,Spark 1.3.0釋出,該版本釋出的最大亮點是新引入的DataFrame API,對於結構型的DataSet,它提供了更方便更強大的操作運算。。除了DataFrame之外,還值得關注的一點是Spark SQL成為了正式版本,這意味著它將更加的穩定,更加的全面;
  • 2016年07月,Spark 2.0.0釋出,該版本主要更新APIs,支援SQL 2003,支援R UDF ,增強其效能。300個開發者貢獻了2500補丁程式;
  • 2016年12月,Spark 2.1.0釋出,這是 2.x 版本線的第二個發行版。此發行版在為Structured Streaming進入生產環境做出了重大突破,Structured Streaming現在支援了event time watermarks了,並且支援Kafka 0.10。此外,此版本更側重於可用性,穩定性和優雅(polish),並解決了1200多個tickets;
  • 目前(20201209),Spark 3.0.1 釋出;

相關文章