Spark、Flink、CarbonData技術實踐最佳案例解析
當前無論是傳統企業還是網際網路公司對大資料實時分析和處理的要求越來越高,資料越實時價值越大,面向毫秒~秒級的實時大資料計算場景,Spark和Flink各有所長。CarbonData是一種高效能大資料儲存方案,已在20+企業生產環境上部署應用,其中最大的單一叢集資料規模達到幾萬億。
為幫助開發者更深入的瞭解這三個大資料開源技術及其實際應用場景,9月8日,InfoQ聯合華為雲舉辦了一場實時大資料Meetup,集結了來自Databricks、華為及美團點評的大咖級嘉賓前來分享。
本文整理了其中的部分精彩內容,同時,作為本次活動的承辦方,InfoQ整理上傳了所有講師的演講PPT,感興趣的同學可以下載講師PPT獲取完整資料 。
Spark Structured Streaming特性介紹Scalable%2C%20Fault-tolerant%20stream%20processing%20with%20Structured%20Streaming-TD.pdf" rel="nofollow,noindex" target="_blank">(講師PPT下載)
作為Spark Structured Streaming最核心的開發人員、Databricks工程師,Tathagata Das(以下簡稱“TD”)在開場演講中介紹了Structured Streaming的基本概念,及其在儲存、自動流化、容錯、效能等方面的特性,在事件時間的處理機制,最後帶來了一些實際應用場景。
首先,TD對流處理所面對的問題和概念做了清晰的講解。TD提到,因為流處理具有如下顯著的複雜性特徵,所以很難建立非常健壯的處理過程:
- 一是資料有各種不同格式(Jason、Avro、二進位制)、髒資料、不及時且無序;
- 二是複雜的載入過程,基於事件時間的過程需要支援互動查詢,和機器學習組合使用;
- 三是不同的儲存系統和格式(SQL、NoSQL、Parquet等),要考慮如何容錯。
因為可以執行在Spark SQL引擎上,Spark Structured Streaming天然擁有較好的效能、良好的擴充套件性及容錯性等Spark優勢。除此之外,它還具備豐富、統一、高層次的API,因此便於處理複雜的資料和工作流。再加上,無論是Spark自身,還是其整合的多個儲存系統,都有豐富的生態圈。這些優勢也讓Spark Structured Streaming得到更多的發展和使用。
流的定義是一種無限表(unbounded table),把資料流中的新資料追加在這張無限表中,而它的查詢過程可以拆解為幾個步驟,例如可以從Kafka讀取JSON資料,解析JSON資料,存入結構化Parquet表中,並確保端到端的容錯機制。其中的特性包括:
- 支援多種訊息佇列,比如Files/Kafka/Kinesis等。
- 可以用join(), union()連線多個不同型別的資料來源。
- 返回一個DataFrame,它具有一個無限表的結構。
- 你可以按需選擇SQL(BI分析)、DataFrame(資料科學家分析)、DataSet(資料引擎),它們有幾乎一樣的語義和效能。
- 把Kafka的JSON結構的記錄轉換成String,生成巢狀列,利用了很多優化過的處理函式來完成這個動作,例如from_json(),也允許各種自定義函式協助處理,例如Lambdas, flatMap。
- 在Sink步驟中可以寫入外部儲存系統,例如Parquet。在Kafka sink中,支援foreach來對輸出資料做任何處理,支援事務和exactly-once方式。
- 支援固定時間間隔的微批次處理,具備微批次處理的高效能性,支援低延遲的連續處理(Spark 2.3),支援檢查點機制(check point)。
- 秒級處理來自Kafka的結構化源資料,可以充分為查詢做好準備。
Spark SQL把批次查詢轉化為一系列增量執行計劃,從而可以分批次地操作資料。
在容錯機制上,Structured Streaming採取檢查點機制,把進度offset寫入stable的儲存中,用JSON的方式儲存支援向下相容,允許從任何錯誤點(例如自動增加一個過濾來處理中斷的資料)進行恢復。這樣確保了端到端資料的exactly-once。
在效能上,Structured Streaming重用了Spark SQL優化器和Tungsten引擎,而且成本降低了3倍!!更多的資訊可以參考作者的blog 。
Structured Streaming隔離處理邏輯採用的是可配置化的方式(比如定製JSON的輸入資料格式),執行方式是批處理還是流查詢很容易識別。同時TD還比較了批處理、微批次-流處理、持續流處理三種模式的延遲性、吞吐性和資源分配情況。
在時間視窗的支援上,Structured Streaming支援基於事件時間(event-time)的聚合,這樣更容易瞭解每隔一段時間發生的事情。同時也支援各種使用者定義聚合函式(User Defined Aggregate Function,UDAF)。另外,Structured Streaming可通過不同觸發器間分散式儲存的狀態來進行聚合,狀態被儲存在記憶體中,歸檔採用HDFS的Write Ahead Log (WAL)機制。當然,Structured Streaming還可自動處理過時的資料,更新舊的儲存狀態。因為歷史狀態記錄可能無限增長,這會帶來一些效能問題,為了限制狀態記錄的大小,Spark使用水印 (watermarking)來刪除不再更新的舊的聚合資料。允許支援自定義狀態函式,比如事件或處理時間的超時,同時支援Scala和Java。
TD在演講中也具體舉例了流處理的應用情況。在蘋果的資訊保安平臺中,每秒將產生有百萬級事件,Structured Streaming可以用來做缺陷檢測,下圖是該平臺架構:
在該架構中,一是可以把任意原始日誌通過ETL載入到結構化日誌庫中,通過批次控制可很快進行災難恢復;二是可以連線很多其它的資料資訊(DHCP session,緩慢變化的資料);三是提供了多種混合工作方式:實時警告、歷史報告、ad-hoc分析、統一的API允許支援各種分析(例如實時報警系統)等,支援快速部署。四是達到了百萬事件秒級處理效能。
更多資訊,可以參考線上的文件:
CarbonData原理、應用和新規劃(講師PPT下載)
華為大資料架構師蔡強在以CarbonData為主題的演講中主要介紹了企業對資料應用的挑戰、儲存產品的選型決策,並深入講解了CarbonData的原理及應用,以及對未來的規劃等。
企業中包含多種資料應用,從商業智慧、批處理到機器學習,資料增長快速、資料結構複雜的特徵越來越明顯。在應用整合上,需要也越來越多,包括支援SQL的標準語法、JDBC和ODBC介面、靈活的動態查詢、OLAP分析等。
針對當前大資料領域分析場景需求各異而導致的儲存冗餘問題,CarbonData提供了一種新的融合資料儲存方案,以一份資料同時支援支援快速過濾查詢和各種大資料離線分析和實時分析,並通過多級索引、字典編碼、預聚合、動態Partition、實時資料查詢等特性提升了IO掃描和計算效能,實現萬億資料分析秒級響應。蔡強在演講中對CarbonData的設計思路做了詳細講解。
- 在資料統一儲存上 :通過資料共享減少孤島和冗餘,支援多種業務場景以產生更大價值。
- 大叢集 :區別於以往的單機系統,使用者希望新的大資料儲存方案能應對日益增多的資料,隨時可以通過增加資源的方式橫向擴充套件,無限擴容。
- 易整合 :提供標準介面,新的大資料方案與企業已採購的工具和IT系統要能無縫整合,支撐老業務快速遷移。另外要與大資料生態中的各種軟體能無縫整合。
- 高效能 :計算與儲存分離,支援從GB到PB大規模資料,十萬億資料秒級響應 。
- 開放生態 :與大資料生態無縫整合,充分利用雲端儲存和Hadoop叢集 的優勢。
資料佈局如下圖,CarbonData用一個HDFS檔案構成一個Block,包含若干Blocklet作為檔案內的列存資料塊,File Header/Fille Footer提供元資料資訊,內建Blocklet索引以及Blocklet級和Page級的統計資訊,壓縮編碼採用RLE、自適應編碼、Snappy/Zstd壓縮,資料型別支援所有基礎和複雜型別:
Carbon表支援索引,支援Segment級(注:一個批次資料匯入為一個segment)的讀寫和資料靈活管理,如按segment進行資料老化和查詢等,檔案佈局如下:
- Spark Driver將集中式的索引存在記憶體中,根據索引快速過濾資料,Hive metastore儲存表的元資料(表的資訊等)。
- 一次Load/Insert對應生成一個Segment, 一個Segment包含多個Shard, 一個Shard就是一臺機器上匯入的多個數據檔案和一個索引檔案組成。每個Segment 包含資料和元資料(CarbonData File和Index檔案),不同的Segment可以有不同的檔案格式,支援更多其他格式(CSV, Parquet),採用增量的資料管理方式,處理比分割槽管理的速度快很多。
查詢時會將filter和projection下推到DataMap(資料地圖)。它的執行模型如下:
- 主要包括Index DataMap和MV DataMap兩種不同DataMap,三級Index索引架構減少了Spark Task數和磁碟IO,MV可以進行預匯聚和join的操作,用資料入庫時間換取查詢時間。
- DataMap根據實際資料量大小選擇集中式或者分散式儲存,以避免大記憶體問題。
- DataMap支援記憶體或磁碟的儲存方式。
最後,蔡強也分析了CarbonData的具體使用和未來計劃。
在使用上,CarbonData提供了非常豐富的功能特性,使用者 可 權衡 入庫時間、索引粒度和查詢效能,增量入庫等方面來靈活設定。表操作 與SparkSQL深度整合,支援高檢測功能的可配置Table Properties。語法和API保持SparkSQL一致,支援併發匯入、更新、合併和查詢。DataMap 類似一張視圖表,可用於加 速Carbon表查詢,通過datamap_provider支援Bloomfilter、Pre-aggregate、MV三種類型的地圖。流式入庫 與Structured Streaming 整合,實現準實時分析。支援同時查詢實時資料和歷史資料,支援預聚合並自動重新整理,聚合查詢會先檢查聚合操作,從而取得資料返回客戶端。準實時查詢, 提供了Stream SQL標準介面,建立臨時的Source表和Sink表。支援類似Structured Streaming(結構化流)的邏輯語句和排程作業。
CarbonData從2016年進入孵化器到2017年畢業,一共釋出了10多個穩定的版本,今年9月份將會迎來1.5.0版的釋出。1.5.0將支援Spark File Format,增強對S3上資料的支援,支援Spark2.3和Hadoop3.1以及複雜型別的支援。而1.5.1主要會對MV支援增量的載入,增強對DataMap的選擇,以及增強了對Presto的支援。
更多資訊,可以參考線上的文件:
Flink在美團的實踐與應用(講師PPT下載)
美團點評資料平臺的高階工程師孫夢瑤介紹了美團的實時平臺架構及當前痛點,帶來了美團如何在Flink上的實踐以及如何打造實時資料平臺,最後介紹了實時指標聚合系統和機器學習平臺是如何利用Flink進行賦能。
孫夢瑤首先介紹了美團目前實時計算平臺的架構:
首先,在資料快取層,Kafka作為最大的資料中轉層(所有日誌類的資料),支撐了美團線上的大量業務,包括離線拉取,以及部分實時處理業務等。其次,引擎層 由計算引擎和儲存引擎來支撐,計算引擎由Storm和Flink混合使用,儲存引擎則提供實時儲存功能。接著,平臺層 為資料開發提供支援,為美團的日誌中心、機器學習中心、實時指標聚合平臺提供支撐。架構最頂層的資料應用層 就是由實時計算平臺支撐的業務。
目前,美團實時計算平臺的作業量已達到近萬,叢集的節點的規模達到千級別,天級訊息量已經達到了萬億級,高峰期的秒級訊息量則高達千萬條。但是,隨著業務的快速擴增,美團點評在實時計算層面仍面臨著一系列的痛點及問題:
- 一是實時計算精確性 問題:由於Storm的At-Least-Once特性導致資料重複,而滿足Exactly-Once的Trident無法保證某些業務的毫秒級延遲要求。
- 二是流處理中的狀態管理 問題:基於Storm的流處理的狀態如果管理不好,會引起故障難以恢復的尷尬狀況。
- 三是實時計算表義能力 的侷限性:基於對實時計算場景的業務需求,發現之前的系統在表義能力方面有一定的限制。
- 四是開發除錯成本 高:不同生態的手工程式碼開發,導致後續開發、除錯、維護成本的增加。
在這樣的的背景下,美團點評基礎資料團隊也開始引入Flink並探索相對應的創新實踐之路。Flink在美團點評的實踐主要包括三大維度:一是穩定性實踐,二是Flink的平臺化,三是生態建設:
-
穩定性實踐層面,
美團點評首先按不同的業務(取決於不同的高峰期、運維時間、可靠性、延遲要求、應用場景等)進行對應的資源隔離
,隔離策略是通過YARN在物理節點上打標籤和隔離離線DataNode與實時計算節點。
其次,再實施基於CPU、基於記憶體的智慧排程 ,目前方案是從CPU和記憶體兩個方面進行排程優化。還包括對Flink的JobManager部署HA(High Availability),保證節點的高可用性 。針對網路連線故障,採用自動拉起的方式,通過checkpoint恢復失敗的作業。
此外,針對Flink對Kafka 08的讀寫超時,美團點評會根據使用者的指定次數對異常進行重試 ,這種方式在解決大規模叢集的節點故障問題時可以做更好的平衡。在容災方面,其採用了多機房 和各種熱備 提升系統的抗故障能力,即使斷電斷網也能進行保證作業繼續進行資料處理。
-
Flink平臺化層面,
通過內部的作業管理
的實時計算平臺,其團隊可以看到總覽的作業狀態,以及資源執行和佔用情況。針對實時作業中可能出現的狀態,比如延遲、失敗,提供監控報警
並能便捷地進行訊息預訂(電話,郵件,簡訊等方式)。針對顯著的效能差別,也提供了調優診斷
的手段進行自助查詢、對比、診斷。
接下來,孫夢瑤還主要講解了Flink在美團的應用,其中主要包括兩點:一是在Petra實時指標 聚合 系統的應用 ,二是用於MLX機器學習平臺的構建 。
-
Petra實時指標
聚合
系統
主要完成對美團業務系統指標的聚合和展示。它對應的場景是整合多個上游系統的業務維度和指標,確保低延遲、同步時效性及可配置。因此美團點評團隊充分利用了Flink基於事件時間和聚合的良好支援、Flink在精確率(checkpoint機制)和低延遲上的特性,以及熱點key雜湊解決了維度計算中的資料傾斜問題。
-
MLX機器學習平臺
MLX機器學習平臺主要通過特徵資料的提取和模型的訓練,支援美團點評的搜尋和推薦以及其他業務的應用。它需要滿足提供離線模式——通過批處理抽取離線特徵資料,同時也提供近線模式——通過Flink抽取實時日誌系統中的特徵資料。接著訓練綜合了離線和近線資料的特徵資料叢集,提取特徵並進行模型訓練,最終產生有意義的特徵。目前,它能支援現有離線場景下的特徵提取體系,通過Flink支援增量線上日誌交易類資料,有了離線和線上資料就能較好的支援模型訓練、特徵提取、線上預估、實時預測等。
未來,美團點評還將從三方面優化Flink相關實踐:
- 狀態的統一方面: 對狀態進行統一的管理以及大狀態效能優化。
- SQL開發效率的提升: 基於Flink在語義上的優勢解決配置、查詢方面的問題,在效能、開發、維護方面做進一步優化。
- 新應用場景的探索: 除流處理外,進一步整合業務場景下離線和線上資料,通過統一的API為業務提供更多的服務。
Flink和Spark流框架對比 + 華為流計算技術演進(講師PPT下載)
華為雲技術專家時金魁作為最後一位演講嘉賓,系統性地梳理、比較了Flink/Spark的流框架,同時介紹了華為流計算技術演進過程,並詳解了華為CloudStream的服務能力及應用。
時金魁一開始即列舉了最常用的流計算框架Storm、Nifi、Spark和Flink等。提供了下面常見開源流計算框架以便大家瞭解這個生態圈的最新情況。
其中,華為雲CloudStream同時支援Flink和Spark(Streaming和Structured Streaming)。時金魁提到,華為流計算團隊在研發過程中發現,Spark Streaming能力有限,無法完全滿足實時流計算場景,而華為自研多年的流框架生態不足,Storm日薄西山,所以華為在2016年轉向Flink為主Spark為輔的組合。今年Spark Structured能力越來越豐富,與Flink之間的gap正快速縮小,也是幸事。
時金魁認為,流計算就是實時處理當下正在發生的流資料,逐條進行大資料分析或演算法運算。它具備以下幾個特徵:
- 資料先後順序不確定導致的亂序 問題。
- 記憶體 計算。
- 流速不定 (資料大小不能預測),資料傾斜 (分佈不均勻),導致計算資源分配不均,能力受限。
- Long running 永遠不結束。
- 基於訊息事件的逐條處理。
- 提供可靠的快照。
從新技術、使用者耐心、大資料增長几個方面,時金魁介紹了實時流計算最大限度挖掘資料的價值,是商業驅動和市場價值的一種體現。實時流計算具有豐富的使用場景,如實時商品的廣告推薦、金融風控、交通物流、車聯網、智慧城市等等。只要需要對實時的大資料推薦或者實時大資料分析,都能找到流計算的應用價值。
時金魁在演講中重點講解了資料流模型,即它是一個實時往下流的過程。在Flink中,客觀的理解就是一個無限的資料流,提供分配和合並,並提供觸發器和增量處理機制。如下圖所示:
時金魁介紹說,對華為而言,Spark,Flink以及CloudStream,這三部分構成了LOGO中的“三條槓”,華為實時流計算服務俗稱“華為雲三道槓”,為客戶主要提供雲端計算的服務。
通過對Flink的核心分析以及執行分析,他解釋瞭如何實現一個完整的資料流處理過程:
- 解析 :邏輯關係解析,生成StreamTransformation
- 分析 :構建StreamGraph,DAG,為生成執行計劃準備
- 生成 :構建ExecutionGraph,為執行做準備
- 執行 :申請資源,執行計劃(運算元)
- 最後生成資料流(DataStream)
下圖是Flink的技術棧圖,包括了一個完整的資料流框架:
此外,時金魁還對Flink和Spark做了詳細的對比。Flink 的優勢包括具備成熟的資料流模型,能提供大量易用的API供使用,在SQL、Table、CEP、ML、Graph方面都提供完善的功能。對比之下,Spark 擁有活躍的社群和完善的生態,Structured Streaming能提供統一標準,保證低延遲。
而華為根據Flink與Spark框架各自的特點,摒棄其劣勢,設計開發出一款全新的實時流計算服務Cloud Stream Service(簡稱CS)。CS採用Apache Flink的Dataflow模型,實現完全的實時計算,同時採用線上SQL編輯平臺編寫的Stream SQL,自定義資料流入、資料處理、資料流出,並完全相容Spark和Flink的API。
總結來說,Cloud Stream具有易用、按需計費、開箱即用、低延時(毫秒)高吞吐(百萬訊息每秒)、完整生態、完全可靠等幾大優勢。
例如,在易用性維度,Cloud Stream利用視覺化的StreamSQL編輯器,因此可以方便地定義SQL,可線上除錯和監控作業。
在安全性維度,華為實時流計算團隊在行業首創了全託管的serverless獨享叢集模式。第一,它採用物理隔離,使得使用者在作業執行時和資源上無共享,多使用者之間無交叉;二是在業務上實現隔離,使得連線、資料和計算相互獨立無干擾;三是沙箱在共享資源池中很難完全防語言、應用、OS等方面的共計,而且對Spark和Flink有一定的侵入性。
線上機器學習方面,CloudStream通過了流式隨機森林演算法應用於實時故障檢測;通過特徵工程應用於實時推薦;通過線上機器學習應用於智慧城市;通過地理分析函式應用於卡車運輸位置檢測。
最後,時金魁也分享了CloudStream支援對接使用者自己搭建的Kafka、Hadoop、Elastic Search、RabbitMQ等開源產品叢集;同時已支援連通華為雲上的其他服務,如訊息通知服務、雲搜尋服務、智慧邊緣平臺等十幾個服務,從而為使用者提供一站式、生態豐富、功能強大的實時流計算平臺。