標籤:

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

本文由 「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/releas)。

毫秒級別的持續流式處理

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

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

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

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

持續模式目前支持的 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 相關。

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

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

Spark 和 Kubernetes

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

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

用於 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/201) 中通過四個例子介紹了如何使用 Pandas UDF。

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

包括 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/201

Introducing Apache Spark 2.3 - The Databricks Blog

databricks.com/blog/201

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

推薦閱讀:

實時處理中的"exactly once"方案具體的應用場景或者使用方法是什麼?
Spark機器學習庫(MLlib)中文指南
為什麼Spark比MapReduce快?
Spark 為什麼 不允許 RDD 嵌套(如 RDD[RDD[T]])?
PySpark使用小結(二)

TAG:Spark | 大數據 |