Apache Spark 2.3重要特性介紹
為了繼續(xù)實(shí)現(xiàn) Spark 更快,更輕松,更智能的目標(biāo),Spark 2.3 在許多模塊都做了重要的更新,比如 Structured Streaming 引入了低延遲的連續(xù)處理(continuous processing);支持 stream-to-stream joins;通過(guò)改善 pandas UDFs 的性能來(lái)提升 PySpark;支持第四種調(diào)度引擎 Kubernetes clusters(其他三種分別是自帶的獨(dú)立模式Standalone,YARN、Mesos)。除了這些比較具有里程碑的重要功能外,Spark 2.3 還有以下幾個(gè)重要的更新:
- 引入 DataSource v2 APIs [SPARK-15689, SPARK-20928]
- 矢量化(Vectorized)的 ORC reader [SPARK-16060]
- Spark History Server v2 with K-V store [SPARK-18085]
- 基于 Structured Streaming 的機(jī)器學(xué)習(xí)管道API模型 [SPARK-13030, SPARK-22346, SPARK-23037]
- MLlib 增強(qiáng) [SPARK-21866, SPARK-3181, SPARK-21087, SPARK-20199]
- Spark SQL 增強(qiáng) [SPARK-21485, SPARK-21975, SPARK-20331, SPARK-22510, SPARK-20236]
這篇文章將簡(jiǎn)單地介紹上面一些高級(jí)功能和改進(jìn),更多的特性請(qǐng)參見(jiàn) Spark 2.3 release notes:https://spark.apache.org/releases/spark-release-2-3-0.html。
毫秒延遲的連續(xù)流處理
Apache Spark 2.0 的 Structured Streaming 將微批次處理(micro-batch processing)從它的高級(jí) APIs 中解耦出去,原因有兩個(gè):首先,開(kāi)發(fā)人員更容易學(xué)習(xí)這些 API,不需要考慮這些 APIs 的微批次處理情況;其次,它允許開(kāi)發(fā)人員將一個(gè)流視為一個(gè)***表,他們查詢流的數(shù)據(jù),就像他們查詢靜態(tài)表一樣簡(jiǎn)便。
但是,為了給開(kāi)發(fā)人員提供不同的流處理模式,社區(qū)引入了一種新的毫秒級(jí)低延遲(millisecond low-latency)模式:連續(xù)模式(continuous mode)。
在內(nèi)部,結(jié)構(gòu)化的流引擎逐步執(zhí)行微批中的查詢計(jì)算,執(zhí)行周期由觸發(fā)器間隔決定,這個(gè)延遲對(duì)大多數(shù)真實(shí)世界的流應(yīng)用程序來(lái)說(shuō)是可以容忍的。

對(duì)于連續(xù)模式,流讀取器連續(xù)拉取源數(shù)據(jù)并處理數(shù)據(jù),而不是按指定的觸發(fā)時(shí)間間隔讀取一批數(shù)據(jù)。通過(guò)不斷地查詢?cè)磾?shù)據(jù)和處理數(shù)據(jù),新的記錄在到達(dá)時(shí)立即被處理,將等待時(shí)間縮短到毫秒,滿足低延遲的應(yīng)用程序的需求,具體如下面圖所示:

目前連續(xù)模式支持 map-like Dataset 操作,包括投影(projections)、selections以及其他 SQL 函數(shù),但是不支持 current_timestamp(), current_date() 以及聚合函數(shù)。它還支持將 Kafka 作為數(shù)據(jù)源和數(shù)據(jù)存儲(chǔ)目的地(sink),也支持 console 和 memory sink。
現(xiàn)在,開(kāi)發(fā)人員可以根據(jù)延遲要求選擇模式連續(xù)或微量批處理,來(lái)構(gòu)建大規(guī)模實(shí)時(shí)流式傳輸應(yīng)用程序,同時(shí)這些系統(tǒng)還能夠享受到 Structured Streaming 提供的 fault-tolerance 和 reliability guarantees 特性。
簡(jiǎn)單來(lái)說(shuō),Spark 2.3 中的連續(xù)模式是實(shí)驗(yàn)性的,它提供了以下特性:
- 端到端的毫秒級(jí)延遲
- 至少一次語(yǔ)義保證
- 支持 map-like 的 Dataset 操作
- 流與流進(jìn)行Join
Spark 2.0 版本的 Structured Streaming 支持流 DataFrame/Dataset 和靜態(tài)數(shù)據(jù)集之間的 join,但是 Spark 2.3 帶來(lái)了期待已久的流和流的 Join 操作。支持內(nèi)連接和外連接,可用在大量的實(shí)時(shí)場(chǎng)景中。
廣告收益是流與流進(jìn)行Join的典型用例。例如,展示廣告流和廣告點(diǎn)擊流共享您希望進(jìn)行流式分析的公共關(guān)鍵字(如adId)和相關(guān)數(shù)據(jù),根據(jù)這些數(shù)據(jù)你可以分析出哪些廣告更容易被點(diǎn)擊。

這個(gè)例子看起來(lái)很簡(jiǎn)答,但是實(shí)現(xiàn)流和流的Join需要解決很多技術(shù)難題,如下:
- 需要緩存延遲的數(shù)據(jù),直到從其他流中找到匹配的事件;
- 通過(guò) watermark 機(jī)制來(lái)限制緩存區(qū)使用增長(zhǎng);
- 用戶可以在資源使用和延遲之間作出權(quán)衡;
- 靜態(tài)連接和流式連接之間保持一致的SQL連接語(yǔ)義。
Apache Spark 和 Kubernetes
Apache Spark 和 Kubernetes 結(jié)合了它們的功能來(lái)提供大規(guī)模的分布式數(shù)據(jù)處理一點(diǎn)都不奇怪。在 Spark 2.3 中,用戶可以利用新的 Kubernetes scheduler backend 在 Kubernetes 集群上啟動(dòng) Spark 工作。 這使得 Spark 作業(yè)可以和 Kubernetes 集群上的其他作業(yè)共享資源。

此外,Spark 可以使用所有管理功能,例如資源配額(Resource Quotas),可插拔授權(quán)(Pluggable Authorization)和日志記錄(Logging)。

支持 PySpark 的 Pandas UDFs
Pandas UDFs 也稱為 Vectorized UDFs,是提升 PySpark 性能的主要推動(dòng)力。它構(gòu)建在 Apache Arrow 的基礎(chǔ)上,為您提供兩全其美的解決方案:低開(kāi)銷和高性能的UDF,并完全使用 Python 編寫(xiě)。
在 Spark 2.3 中,有兩種類型的 Pandas UDF:標(biāo)量(scalar)和分組映射(grouped map)。 兩者均可在 Spark 2.3 中使用。
下面是運(yùn)行的一些基準(zhǔn)測(cè)試,可以看出 Pandas UDFs 比 row-at-time UDFs 提供更好的性能。

MLlib 提升
Spark 2.3 包含了許多 MLlib 方面的提升,主要有算法、特性、性能、擴(kuò)展性以及可用性。這里只介紹其中三方面。
首先,為了將 MLlib 模型和 Pipelines 移動(dòng)到生產(chǎn)環(huán)境,現(xiàn)在擬合的模型(fitted models)和 Pipelines 可以在 Structured Streaming 作業(yè)中使用。 一些現(xiàn)有的管道(Pipelines)需要修改才能在流式作業(yè)中進(jìn)行預(yù)測(cè)。
其次,為了實(shí)現(xiàn)許多 Deep Learning 圖像分析用例,Spark 2.3 引入了 ImageSchema [SPARK-21866] 用于在 Spark DataFrame中表示圖像,以及加載常見(jiàn)格式圖像的實(shí)用程序。
***,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),Spark 2.3 引入了改進(jìn)的 Python API以編寫(xiě)自定義算法。