Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理

AI前線發表於2018-03-01
本文由 「AI前線」原創,原文連結:Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理
策劃編輯|Natalie
作者|Sameer Agarwal,Xiao Li,Reynold Xin ,Jules Damji
譯者|薛命燈

AI 前線導讀:”2018 年 2 月 28 日,Databricks 在官方工程部落格上正式釋出 Apache Spark 2.3.0,作為 Databricks Runtime 4.0 beta 的一部分。新版本引入了持續流式處理模型,可將流處理延遲降低至毫秒級別,據說會成為 PK Flink 的大殺器。還有哪些重要更新,是不是該給 Spark 升個級,看完就有數了!”

Spark 2.3 繼續向更快、更易用、更智慧的目標邁進,引入了低延遲的持續處理能力和流到流的連線,讓 Structured Streaming 達到了一個里程碑式的高度;使用 Pandas UDF 提升 PySpark 的效能;為 Spark 應用程式提供 Kubernetes 原生支援。

除了繼續引入 SparkR、Python、MLlib 和 GraphX 方面的新功能,這一版本主要在可用性和穩定性方面下了功夫,解決了 1400 多個 ticket。其他主要特性如下:

  • DataSource V2 API
  • 向量化的 ORC Reader
  • 包含鍵值儲存的 Spark History Server V2
  • 基於 Structured Streaming 的機器學習管道 API
  • MLlib 增強
  • Spark SQL 增強

下面將簡單概括一些主要的特性和改進,更多資訊可參看 Spark 2.3 釋出通告(spark.apache.org/releases/sp…)。


毫秒級別的持續流式處理

出於某些原因的考慮,Spark 2.0 引入的 Structured Streaming 將微批次處理從高階 API 中解耦出去。首先,它簡化了 API 的使用,API 不再負責進行微批次處理。其次,開發者可以將流看成是一個沒有邊界的表,並基於這些“表”執行查詢。

不過,為了給開發者提供更多的流式處理體驗,Spark 2.3 引入了毫秒級延遲的持續流式處理模式。

從內部來看,Structured Streaming 引擎基於微批次增量執行查詢,時間間隔視具體情況而定,不過這樣的延遲對於真實世界的流式應用來說都是可接受的。

Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理

在持續模式下,流處理器持續不斷地從資料來源拉取和處理資料,而不是每隔一段時間讀取一個批次的資料,這樣就可以及時地處理剛到達的資料。如下圖所示,延遲被降低到毫秒級別,完全滿足了低延遲的要求。

Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理

持續模式目前支援的 Dataset 操作包括 Projection、Selection 以及除 current_timestamp()、current_date()、聚合函式之外的 SQL 操作。它還支援將 Kafka 作為資料來源和資料池(Sink),也支援將控制檯和記憶體作為資料池。

開發者可以根據實際的延遲需求來選擇使用持續模式還是微批次模式,總之,Structured Streaming 為開發者提供了容錯和可靠性方面的保證。

簡單地說,Spark 2.3 的持續模式所能做到的是:

  • 端到端的毫秒級延遲
  • 至少一次處理保證
  • 支援 Dataset 的對映操作


流到流的連線

Spark 2.0 的 Structured Streaming 已經可以支援 DataFrame/Dataset 的連線操作,但只是流到靜態資料集的連線,而 Spark 2.3 帶來了期待已久的流到流的連線,支援內連線和外連線,可用在大量的實時場景中。

廣告變現是流到流連線的一個典型應用場景。例如,廣告 impression 流和使用者點選流包含相同的鍵(如 adld)和相關資料,而你需要基於這些資料進行流式分析,找出哪些使用者的點選與 adld 相關。

Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理

雖然看起來很簡單,但實際上流到流的連線解決了一些技術性難題:

  • 將遲到的資料緩衝起來,直到在另一個流中找到與之匹配的資料。
  • 通過設定水位(Watermark)防止緩衝區過度膨脹。
  • 使用者可以在資源消耗和延遲之間作出權衡。
  • 靜態連線和流連線之間的 SQL 語法是一致的。


Spark 和 Kubernetes

Spark 和 Kubernetes 這兩個開源專案之間的功能組合也在意料之內,用於提供大規模分散式的資料處理和編配。在 Spark 2.3 中,使用者可在 Kubernetes 叢集上原生地執行 Spark,從而更合理地使用資源,不同的工作負載可共享 Kubernetes 叢集。

Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理

Spark 可以使用 Kubernetes 的所有管理特性,如資源配額、可插拔的授權和日誌。另外,要在已有的 Kubernetes 叢集上啟動 Spark 工作負載就像建立一個 Docker 映象那麼簡單。

Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理


用於 SySpark 的 Pandas UDF

Pandas UDF,也被稱為向量化的 UDF,為 PySpark 帶來重大的效能提升。Pandas UDF 以 Apache Arrow 為基礎,完全使用 Python 開發,可用於定義低開銷、高效能的 UDF。

Spark 2.3 提供了兩種型別的 Pandas UDF:標量和組合 map。來自 Two Sigma 的 Li Jin 在之前的一篇部落格(databricks.com/blog/2017/1…) 中通過四個例子介紹瞭如何使用 Pandas UDF。

一些基準測試表明,Pandas UDF 在效能方面比基於行的 UDF 要高出一個數量級。

Spark 2.3重磅釋出:欲與Flink爭高下,引入持續流處理

包括 Li Jin 在內的一些貢獻者計劃在 Pandas UDF 中引入聚合和視窗功能。


MLlib 方面的改進

Spark 2.3 帶來了很多 MLlib 方面的改進,包括演算法、特性、效能、伸縮性和可用性。

首先,可通過 Structured Streaming 作業將 MLlib 的模型和管道部署到生產環境,不過一些已有的管道可能需要作出修改。

其次,為了滿足深度學習影象分析方面的需求,Spark 2.3 引入了 ImageSchema,將影象表示成 Spark DataFrame,還提供工具用於載入常用的影象格式。

最後,Spark 2.3 帶來了改進過的 Python API,用於開發自定義演算法,包括 UnaryTransformer 以及用於儲存和載入演算法的自動化工具。

原文連結:

databricks.com/blog/2018/0…

Introducing Apache Spark 2.3 - The Databricks Blog

databricks.com/blog/2018/0…

更多幹貨內容,可關注AI前線,ID:ai-front,後臺回覆「AI」、「TF」、「大資料」可獲得《AI前線》系列PDF迷你書和技能圖譜。


相關文章