Lyft 基於 Flink 的大規模準實時數據分析平臺(附FFA大會視頻)

如何基於 Flink 搭建大規模準實時數據分析平臺?在 Flink Forward Asia 2019 上,來自 Lyft 公司實時數據平臺的徐贏博士和計算數據平臺的高立博士分享了 Lyft 基於 Apache Flink 的大規模準實時數據分析平臺。算法

做者: 徐贏、高立數據庫

摘要:如何基於 Flink 搭建大規模準實時數據分析平臺?在 Flink Forward Asia 2019 上,來自 Lyft 公司實時數據平臺的徐贏博士和計算數據平臺的高立博士分享了 Lyft 基於 Apache Flink 的大規模準實時數據分析平臺。後端

查看FFA大會視頻網絡

本次分享主要分爲四個方面:架構

  1. Lyft 的流數據與場景
  2. 準實時數據分析平臺和架構
  3. 平臺性能及容錯深刻分析
  4. 總結與將來展望

重要:文末「閱讀原文」可查看 Flink Forward Asia 大會視頻。框架

1、Lyft 的流數據與場景

關於 Lyft

Lyft 是位於北美的一個共享交通平臺,和你們所熟知的 Uber 和國內的滴滴相似,Lyft 也爲民衆提供共享出行的服務。Lyft 的宗旨是提供世界最好的交通方案來改善人們的生活。運維

幻燈片04.png

Lyft 的流數據場景

Lyft 的流數據能夠大體分爲三類,秒級別、分鐘級別和不高於 5 分鐘級別。分鐘級別流數據中,自適應訂價系統、欺詐和異常檢測系統是最經常使用的,此外還有 Lyft 最新研發的機器學習特徵工程。不高於 5 分鐘級別的場景則包括準實時數據交互查詢相關的系統。機器學習

幻燈片05.png

Lyft 數據分析平臺架構

以下圖所示的是 Lyft 以前的數據分析平臺架構。Lyft 的大部分流數據都是來自於事件,而事件產生的來源主要有兩種,分別是手機 APP 和後端服務,好比乘客、司機、支付以及保險等服務都會產生各類各樣的事件,而這些事件都須要實時響應。佈局

幻燈片06.png

在分析平臺這部分,事件會流向 AWS 的 Kinesis 上面,這裏的 Kinesis 與 Apache Kafka 很是相似,是一種 AWS 上專有的 PubSub 服務,而這些數據流都會量化成文件,這些文件則都會存儲在 AWS 的 S3 上面,而且不少批處理任務都會彈出一些數據子集。在分析系統方面,Lyft 使用的是開源社區中比較活躍的 presto 查詢引擎。Lyft 數據分析平臺的用戶主要有四種,即數據工程師、數據分析師以及機器學習專家和深度學習專家,他們每每都是經過分析引擎實現與數據的交互。性能

既往平臺的問題

Lyft 之因此要基於 Apache Flink 實現大規模準實時數據分析平臺,是由於以往的平臺存在一些問題。好比較高的延遲,導入數據沒法知足準實時查詢的要求;而且基於 Kinesis Client Library 的流式數據導入性能不足;導入數據存在太多小文件致使下游操做性能不足;數據 ETL 大可能是高延遲多日多步的架構;此外,以往的平臺對於嵌套數據提供的支持也不足。

幻燈片07.png

2、準實時數據分析平臺和架構

準實時平臺架構

在新的準實時平臺架構中,Lyft 採用 Flink 實現流數據持久化。Lyft 使用雲端存儲,而使用 Flink 直接向雲端寫一種叫作 Parquet 的數據格式,Parquet 是一種列數據存儲格式,可以有效地支持交互式數據查詢。Lyft 在 Parquet 原始數據上架構實時數倉,實時數倉的結構被存儲在 Hive 的 Table 裏面,Hive Table 的 metadata 存儲在 Hive metastore 裏面。

平臺會對於原始數據作多級的非阻塞 ETL 加工,每一級都是非阻塞的(nonblocking),主要是壓縮和去重的操做,從而獲得更高質量的數據。平臺主要使用 Apache Airflow 對於 ETL 操做進行調度。全部的 Parquet 格式的原始數據均可以被 presto 查詢,交互式查詢的結果將可以以 BI 模型的方式顯示給用戶。

幻燈片09.png

平臺設計

Lyft 基於 Apache Flink 實現的大規模準實時數據分析平臺具備幾個特色:

  • 首先,平臺藉助 Flink 實現高速有效的流數據接入,使得雲上集羣規模縮減爲原來的十分之一,所以大大下降了運維成本。
  • 其次,Parquet 格式的數據支持交互式查詢,當用戶僅對於某幾個列數據感興趣時能夠經過分區和選擇列的方式過濾沒必要要的數據,從而提高查詢的性能。
  • 再次,基於 AWS 的雲端存儲,平臺的數據無需特殊存儲形式。
  • 以後,多級 ETL 進程可以確保更好的性能和數據質量。
  • 最後,還可以兼顧性能容錯及可演進性。

幻燈片10.png

平臺特徵及應用

Lyft 準實時數據分析平臺須要天天處理千億級事件,可以作到數據延遲小於 5 分鐘,而鏈路中使用的組件確保了數據完整性,同時基於 ETL 去冗餘操做實現了數據單一性保證。

幻燈片11.png

數據科學家和數據工程師在建模時會須要進行自發的交互式查詢,此外,平臺也會提供實時機器學習模型正確性預警,以及實時數據面板來監控供需市場健康情況。

幻燈片12.png

基於 Flink 的準實時數據導入

下圖能夠看到當事件到達 Kinesis 以後就會被存儲成爲 EventBatch。經過 Flink-Kinesis 鏈接器能夠將事件提取出來並送到 FlatMap 和 Record Counter 上面,FlatMap 將事件打撒並送到下游的 Global Record Aggregator 和 Tagging Partitioning 上面,每當作 CheckPoint 時會關閉文件並作一個持久化操做,針對於 StreamingFileSink 的特徵,平臺設置了每三分鐘作一次 CheckPoint 操做,這樣能夠保證當事件進入 Kinesis 鏈接器以後在三分鐘以內就可以持久化。

幻燈片13.png

以上的方式會形成太多數量的小文件問題,由於數據鏈路支持成千上萬種文件,所以使用了 Subtasks 記錄本地事件權重,並經過全局記錄聚合器來計算事件全局權重並廣播到下游去。而 Operator 接收到事件權重以後將會將事件分配給 Sink。

ETL 多級壓縮和去重

上述的數據鏈路也會作 ETL 多級壓縮和去重工做,主要是 Parquet 原始數據會通過每小時的智能壓縮去重的 ETL 工做,產生更大的 Parquet File。同理,對於小時級別壓縮去重不夠的文件,天天還會再進行一次壓縮去重。對於新產生的數據會有一個原子性的分區交換,也就是說當產生新的數據以後,ETL Job 會讓 Hive metastore 裏的表分區指向新的數據和分區。這裏的過程使用了啓發性算法來分析哪些事件必需要通過壓縮和去重以及壓縮去重的時間間隔級別。此外,爲了知足隱私和合規的要求,一些 ETL 數據會被保存數以年計的時間。

幻燈片14.png

3、平臺性能及容錯深刻分析

事件時間驅動的分區感測

Flink 和 ETL 是經過事件時間驅動的分區感測實現同步的。S3 採用的是比較常見的分區格式,最後的分區是由時間戳決定的,時間戳則是基於 EventTime 的,這樣的好處在於可以帶來 Flink 和 ETL 共同的時間源,這樣有助於同步操做。此外,基於事件時間可以使得一些回填操做和主操做實現相似的結果。Flink 處理完每一個小時的事件後會向事件分區寫入一個 Success 文件,這表明該小時的事件已經處理完畢,ETL 能夠對於該小時的文件進行操做了。

幻燈片16.png

Flink 自己的水印並不能直接用到 Lyft 的應用場景當中,主要是由於當 Flink 處理完時間戳並不意味着它已經被持久化到存儲當中,此時就須要引入分區水印的概念,這樣一來每一個 Sink Source 就可以知道當前寫入的分區,而且維護一個分區 ID,而且經過 Global State Aggregator 聚合每一個分區的信息。每一個 Subtasks 可以知道全局的信息,並將水印定義爲分區時間戳中最小的一個。

幻燈片17.png

ETL 主要有兩個特色,分別是及時性和去重,而 ETL 的主要功能在於去重和壓縮,最重要的是在非阻塞的狀況下就進行去重。前面也提到 Smart ETL,所謂 Smart 就是智能感知,須要兩個相應的信息來引導 Global State Aggregator,分別是分區完整性標識 SuccessFile,在每一個分區還有幾個相應的 States 統計信息可以告訴下游的 ETL 怎樣去重和壓縮以及操做的頻率和範圍。

幻燈片18.png

Schema 演進的挑戰

ETL 除了去重和壓縮的挑戰以外,還常常會遇到 Schema 的演化挑戰。Schema 演化的挑戰分爲三個方面,即不一樣引擎的數據類型、嵌套結構的演變、數據類型演變對去重邏輯的影響。

幻燈片19.png

S3 深刻分析

Lyft 的數據存儲系統其實能夠認爲是數據湖,對於 S3 而言,Lyft 也有一些性能的優化考量。S3 自己內部也是有分區的,爲了使其具備並行的讀寫性能,添加了 S3 的熵數前綴,在分區裏面也增長了標記文件,這兩種作法可以極大地下降 S3 的 IO 性能的影響。標識符對於可否觸發 ETL 操做會產生影響,與此同時也是對於 presto 的集成,可以讓 presto 決定什麼狀況下可以掃描多少個文件。

幻燈片20.png

Parquet 優化方案

Lyft 的準實時數據分析平臺在 Parquet 方面作了不少優化,好比文件數據值大小範圍統計信息、文件系通通計信息、基於主鍵數據值的排序加快 presto 的查詢速度以及二級索引的生成。

幻燈片21.png

基於數據回填的平臺容錯機制

以下兩個圖所示的是 Lyft 準實時數據分析平臺的基於數據回填的平臺容錯機制。對於 Flink 而言,由於平臺的要求是達到準實時,而 Flink 的 Job 出現失效的時候可能會超過必定的時間,當 Job 從新開始以後就會造成兩個數據流,主數據流老是從最新的數據開始往下執行,附加數據流則能夠回溯到以前中斷的位置進行執行直到中斷結束的位置。這樣的好處是既能保證主數據流的準實時特性,同時經過回填數據流保證數據的完整性。

幻燈片22.png

對於 ETL 而言,基於數據回填的平臺容錯機制則表如今 Airflow 的冪等調度系統、原子壓縮和 HMS 交換操做、分區自建自修復體系和 Schema 整合。

幻燈片23.png

4、總結與將來展望

體驗與經驗教訓

利用 Flink 可以準實時注入 Parquet 數據,使得交互式查詢體驗爲可能。同時,Flink 在 Lyft 中的應用不少地方也須要提升,雖然 Flink 在大多數狀況的延時都可以獲得保證,可是重啓和部署的時候仍然可能形成分鐘級別的延時,這會對於 SLO 產生必定影響。

此外,Lyft 目前作的一件事情就是改善部署系統使其可以支持 Kubernetes,而且使得其可以接近 0 宕機時間的效果。由於 Lyft 準實時數據分析平臺在雲端運行,所以在將數據上傳到 S3 的時候會產生一些隨機的網絡狀況,形成 Sink Subtasks 的停滯,進而形成整個 Flink Job 的停滯。而經過引入一些 Time Out 機制來檢測 Sink Subtasks 的停滯,使得整個 Flink Job 可以順利運行下去。

ETL 分區感應可以下降成本和延遲,成功文件則可以表示何時處理完成。此外,S3 文件佈局對性能提高的影響仍是很是大的,目前而言引入熵數還屬於經驗總結,後續 Lyft 也會對於這些進行總結分析而且公開。由於使用 Parquet 數據,所以對於 Schema 的兼容性要求就很是高,若是引入了不兼容事件則會使得下游的 ETL 癱瘓,所以 Lyft 已經作到的就是在數據鏈路上游對於 Schema 的兼容性進行檢查,檢測並拒絕用戶提交不兼容的 Schema。

幻燈片24.png

將來展望

Lyft 對於準實時數據分析平臺也有一些設想。

  • 首先,Lyft 但願將 Flink 部署在 Kubernetes 集羣環境下運行,使得 Kubernetes 可以管理這些 Flink Job,同時也可以充分利用 Kubernetes 集羣的高可擴展性。
  • 其次,Lyft 也但願實現通用的流數據導入框架,準實時數據分析平臺不只僅支持事件,也可以支持數據庫以及服務日誌等數據。
  • 再次,Lyft 但願平臺可以實現 ETL 智能壓縮以及事件驅動 ETL,使得回填等事件可以自動觸發相應的 ETL 過程,實現和之前的數據的合併,同時將延時數據導入來對於 ETL 過程進行更新。
  • 最後,Lyft 還但願準實時數據分析平臺可以實現存儲過程的改進以及查詢優化,藉助 Parquet 的統計數據來改善 presto 的查詢性能,藉助表格管理相關的開源軟件對存儲管理進行性能改善,同時實現更多的功能。

做者簡介:

  • 徐贏博士是 Lyft 數據平臺流媒體平臺的技術領導(Technical Lead),目前主導準實時數據分析平臺的架構開發。在 Lyft 以前,他曾在領英(Linkedin)以及 IBM 擔任技術領導職位,主導領英跨數據中心數據庫複製的上線,以及 IBM 高速數據傳輸技術的研發。
  • 高立博士在 Lyft 的數據平臺團隊中工做,目前領導 Lyft 數據平臺內的多個數據基礎架構項目,包括實時數據倉庫,自服務機器學習平臺項目等。 曾在 Salesforce,Fitbit,Groupon 和其餘初創公司擔任關鍵技術領導職務。
相關文章
相關標籤/搜索