Spark簡單認識

什麼是Spark

spark 架構

Spark 是一個開源的分佈式查詢和處理引擎。

提供MapReduce的靈活性和擴展性:

  • 當數據存儲在內存時比Apache Hadoop快100倍
  • 訪問磁盤時高達10倍

允許用戶讀取、轉換、聚合數據,還可以訓練部署複雜的統計模型。
Java、Scala、Python、R、SQL都可以訪問Spark API。

Spark 提供了幾個已經實現並調優過的算法、統計模型和框架:

  • 機器學習-MLlib和ML
  • 圖形處理-GraphX、GraphFrames
  • 流計算-Spark Streaming (DStream和Structured)

允許用戶在同一個應用程序中隨意地組合使用這些庫。

可以從不同的數據源讀取和寫入,包括但不限於 HDFS、Cassandra、HBase和S3。

作業和API

執行過程

任何Spark應用程序都會分離主節點上的單個驅動進程(可以包含多個作業),然後將執行進程(包含多個任務)分配給多個工作節點。

驅動進程會確定任務進程的數量和組成,這些任務進程是根據爲指定作業生成的圖形分配給執行節點的。任何工作節點都可以執行來自多個不同作業的多個任務。

Spark作業與一系列對象依賴相關聯,這些依賴關係是以有向無環圖(DAG)的方式組織的。基於這些,Spark可以優化調度(例如確定所需的任務和工作節點的數量)並執行這些任務。

彈性分佈式數據集RDD

彈性分佈式數據集(簡稱RDD)是不可變Java虛擬機(JVM)對象的分佈式集合,Spark就是圍繞着RDD而構建的。我們使用Python時,Python數據是存儲在這些JVM對象中的。

這些對象允許作業非常快速地執行計算。對RDD的計算依據緩存和存儲在內存中的模式進行:與其他傳統分佈式框架(如Apache Hadoop)相比,該模式使得計算速度快了一個數量級。

同時,RDD會給出一些粗粒度的數據轉換(例如map(…)、reduce(…)和filter(…)),保持Hadoop平臺的靈活性和可擴展性,以執行各種各樣的計算。

RDD以並行方式應用和記錄數據轉換,從而提高了速度和容錯能力。通過註冊這些轉換,RDD提供數據沿襲——以圖形形式給出的每個中間步驟祖先樹。這實際上保護RDD免於數據丟失——如果一個RDD的分區丟失,它仍然具有足夠的信息來重新創建該分區,而不是簡單地依賴複製。

RDD有兩組並行操作:
- 轉換(返回指向新RDD的指針)
- 動作(在運行計算後向驅動程序返回值)

某種意義上來說,RDD轉換操作是惰性的,因爲它們不立即計算其結果。只有動作執行了並且需要將結果返回給驅動程序時,纔會計算轉換。

該延遲執行會產生更多精細查詢:針對性能進行優化的查詢。

  • 這種優化始於Spark的DAG Scheduler——面向階段的調度器,使用如上面截圖中所示的階段進行轉換。由於具有單獨的RDD轉換和動作,DAG Scheduler可以在查詢中執行優化,包括能夠避免shuffle數據(最耗費資源的任務)。

DataFrame

Data Frame像RDD一樣,是分佈在集羣的節點中的不可變數據集合。然而,與RDD不同的是,在DataFrame中,數據是以命名列的方式組織的。

DataFrame的一個主要優點是,Spark引擎一開始就構建了一個邏輯執行計劃,而且執行生成的代碼是基於成本優化程序確定的物理計劃。與Java或者Scala相比,Python中的RDD是非常慢的,而DataFrame的引入則使性能在各種語言中都保持穩定。

Dataset

Spark 1.6中引入的Dataset旨在提供一個API,允許用戶輕鬆地表達域對象的轉換,同時還提供了具有強大性能和優點的Spark SQL執行引擎。但目前Dataset僅在Scala或Java中可用。

Catalyst 優化器

Spark SQL是Spark最具技術性的組件之一,因爲它支持SQL查詢和DataFrameAPI。

Spark SQL的核心是Catalyst優化器。優化器基於函數式編程結構,並且旨在實現兩個目的:簡化向Spark SQL添加新的優化技術和特性的條件,並允許外部開發人員擴展優化器(例如,添加數據源特定規則,支持新的數據類型等等)

Spark 2.0的架構

Spark2.0的引入是ApacheSpark項目基於過去兩年平臺開發經驗近期所發佈的主要版本更新,發佈三個重要主題包括性能增強:
- 通過TungstenPhase2
- 引入結構化
- 統一Dataset和DataFrame

統一Dataset和DataFrame

Dataset於2015年作爲Spark1.6版本的一部分推出。

Dataset的目標是提供一個類型安全的編程接口。這允許開發人員使用編譯時類型安全(生產應用程序可以在運行之前檢查錯誤)處理半結構化數據(如JSON或鍵值對)。Python不實現DatasetAPI的部分原因是Python不是一種類型安全的語言。

Dataset API包含高級別域的特定語言操作,如sum()、avg()、join()和group()。這種最新的特性意味着不僅具有傳統Spark RDD的靈活性,而且代碼也更容易表達、讀取和寫入。

與DataFrame類似,Dataset可以通過將表達式和數據字段暴露給查詢計劃器並藉助Tungsten的快速內存編碼來運用Spark的Catalyst優化器。

現在DataFrame和Dataset都屬於新的DatasetAPI,作爲ApacheSpark2.0的一部分被引入進來DataFrame和Dataset已統一爲Apache Spark2.0的一部分,DataFrame是未類型化的DatasetAPI的一個別名。

類比來說:

DataFrame = Dataset[Row]

SparkSession 介紹

在過去,可能會使用SparkConf、SparkContext、SQLContext和HiveContext來分別執行配置、Spark環境、SQL環境和Hive環境的各種Spark查詢。SparkSession本質上是這些環境的組合,包括StreamingContext。它是讀取數據、處理元數據、配置會話和管理集羣資源的入口。

Tungsten Phase 2

Project Tungsten於2015年推出,旨在爲Spark引擎的性能提高做出顯著改進。這些改進的第一階段側重於以下幾個方面:

  • 內存管理和二進制處理
  • 高速緩存感知計算
  • 代碼生成
  • 沒有虛擬函數調度
  • CPU寄存器存儲中間數據
  • 循環展開和SIMD

結構化流

基礎。雖然流媒體功能強大,但關鍵問題之一是流可能難以構建和維護。爲了簡化SparkStreaming,現在有一個單一API可以解決Spark2.0版本中的批處理和流式處理。

更簡潔地說,高級流API現在構建在SparkSQL引擎之上。它運行的查詢與使用Dataset、DataFrame時完全相同,爲你提供所有性能和優化以及事件時間、窗口、會話(session)、源(source)和槽(sink)等方面的優勢。

連續應用

總而言之,Spark2.0不僅統一了DataFrame和Dataset,而且統一了流、交互式和批處理查詢。產生了一整套新的用例,包括將數據聚合到流中並使用傳統的JDBC/ODBC提供它,在運行時更改查詢,或在多種場景中構建和應用ML模型的延遲用例。

同時,你可以構建端到端的連續應用程序,在其中可以對實時數據進行批處理,執行ETL、生成報告、更新或跟蹤流中的特定數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章