Categories
程式開發

Apache Flink OLAP引擎性能優化及應用


導讀:本次分享的主題為Apache Flink新場景——OLAP引擎,主要內容包括:

  • 背景介紹
  • Apache Flink OLAP引擎
  • 案例介紹
  • 未來計劃

Apache Flink OLAP引擎性能優化及應用 1

1. OLAP及其分類

Apache Flink OLAP引擎性能優化及應用 2

OLAP是一種讓用戶可以用從不同視角方便快捷的分析數據的計算方法。主流的OLAP可以分為3類:多維OLAP ( Multi-dimensional OLAP )、關係型OLAP ( Relational OLAP ) 和混合OLAP ( Hybrid OLAP ) 三大類。

多維OLAP ( MOLAP )

  • 傳統的OLAP分析方式
  • 數據存儲在多維數據集中

關係型OLAP ( ROLAP )

  • 以關係數據庫為核心,以關係型結構進行多維數據的表示
  • 通過SQL的where條件以呈現傳統OLAP的切片、切塊功能

混合OLAP ( HOLAP )

  • 將MOLAP和ROLPA的優勢結合起來,以獲得更快的性能

接下來為大家詳細介紹下:

① MOLAP

Apache Flink OLAP引擎性能優化及應用 3

典型代表

MOLAP的典型代表是Kylin和Druid。

處理流程

  • 對原始數據做數據預處理
  • 預處理後的數據存至數據倉庫
  • 用戶的請求通過OLAP server查詢數據倉庫中的數據

MOLAP的優點和缺點

MOLAP的優點和缺點都來自於其數據預處理 ( pre-processing ) 環節。數據預處理,將原始數據按照指定的計算規則預先做聚合計算,這樣避免了查詢過程中出現大量的臨時計算,提升了查詢性能,同時也為很多複雜的計算提供了支持。

但是這樣的預聚合處理,需要預先定義維度,會限制後期數據查詢的靈活性;如果查詢工作涉及新的指標,需要重新增加預處理流程,損失了靈活度,存儲成本也很高;同時,這種方式不支持明細數據的查詢。

因此,MOLAP適用於對性能非常高的場景。

② ROLAP

Apache Flink OLAP引擎性能優化及應用 4

典型代表

ROLAP的典型代表是Presto和Impala。

處理流程

  • 用戶的請求直接發送給OLAP server
  • OLAP serve將用戶的請求轉換成關係型操作算子:
    1. 通過SCAN掃描原始數據
    2. 在原始數據基礎上做過濾、聚合、關聯等處理
  • 將計算結果返回給用戶

ROLAP的優點和缺點

ROLAP不需要進行數據預處理 ( pre-processing ),因此查詢靈活,可擴展性好。這類引擎使用MPP架構 ( 與Hadoop相似的大型並行處理架構,可以通過擴大並發來增加計算資源 ),可以高效處理大量數據。但是當數據量較大或query較為複雜時,查詢性能也無法像MOLAP那樣穩定。所有計算都是臨時發生 ( 沒有預處理 ),因此會耗費更多的計算資源。

因此,ROLAP適用於對查詢靈活性高的場景。

③ HOLAP

混合OLAP,是MOLAP和ROLAP的一種融合。當查詢聚合性數據的時候,使用MOLAP技術;當查詢明細數據時,使用ROLAP技術。在給定使用場景的前提下,以達到查詢性能的最優化。

2. Apache Flink介紹

① 當前Apache Flink支持的應用場景

Apache Flink OLAP引擎性能優化及應用 5

Apache Flink支持的3種典型應用場景:

  1. 事件驅動的應用
  • 反欺詐
  • 基於規則的監控報警
  1. 流式Pipeline
  • 數據ETL
  • 實時搜索引擎的索引
  1. 批處理&流處理分析
  • 網絡質量監控
  • 消費者實時數據分析

② Apache Flink 架構

Apache Flink OLAP引擎性能優化及應用 6

③ Apache Flink 優勢

Apache Flink OLAP引擎性能優化及應用 7

  1. 統一框架 ( 不區分流處理和批處理 )
  • 用戶API統一
  • 執行引擎統一
  1. 多層次API
  • 標準SQL APL
  • Table API
  • DataStream API ( 靈活,無schema限制 )
  1. 高性能
  • 支持內存計算
  • 支持代價模型優化
  • 支持代碼動態生成
  1. 方便集成
  • 支持豐富的Connectors
  • 方便對接現有catalog
  1. 靈活的Failover策略
  • 在Pipeline下支持快速failover
  • 類似MapReduce、Spark一樣支持shuffle數據落盤
  1. 易部署維護
  • 靈活部署方案
  • 支持高可用

Apache Flink OLAP引擎性能優化及應用 8

1. Apache Flink OLAP引擎

① 為什麼Apache Flink 可以做ROLAP引擎?

Apache Flink OLAP引擎性能優化及應用 9

  • Flink的核心和基礎是流計算,支持高性能、低延遲的大規模計算
  • Blink將批看作有限流,批處理是針對有限數據集的優化,因此批處理引擎也是構建在流引擎上 ( 已開源 )
  • OLAP是響應時間要求更短的批處理,因此OLAP可以看作是一種特殊的批。 OLAP引擎也可以構建在現有的批引擎上

注:Flink OLAP引擎目前不帶存儲,只是一個計算框架

② Apache Flink 做OLAP引擎的優勢

Apache Flink OLAP引擎性能優化及應用 10

統一引擎:流處理、批處理、OLAP統一使用Flink引擎

  • 降低學習成本,僅需要學習一個引擎
  • 提高開發效率,很多SQL是流批通用
  • 提高維護效率,可以更集中維護好一個引擎

既有優勢:利用Flink已有的很多特性,使OLAP使用場景更為廣泛

  • 使用流處理的內存計算、Pipeline
  • 支持代碼動態生成
  • 也可以支持批處理數據落盤能力

相互增強:OLAP能享有現有引擎的優勢,同時也能增強引擎能力

  • 無統計信息場景的優化
  • 開發更高效的算子
  • 使Flink同時兼備流、批、OLAP處理的能力,成為更通用的框架

2. 性能優化

OLAP 對查詢時間非常敏感,當前很多組件的性能不滿足要求,因此我們對Flink做了很多相關優化。

① 服務架構的優化

客戶端服務化

下圖介紹了一條SQL怎麼在客戶端一步一步變為JobGraph,最終提交給JM:

Apache Flink OLAP引擎性能優化及應用 11

在改動之前,每次接受一個query時會啟動一個新的JVM進程來進行作業的編譯。其中JVM的啟動、Class的加載、代碼的動態編譯 ( 如Optimizer模塊由於需要通過Janino動態編譯進行cost計算 ) 等操作都非常耗時 ( 需要約3~5s )。因此,我們將客戶端進行服務化,將整個Client做成Service,當接收到用戶的query時,無需重複各項加載工作,可將延時降低至100ms 左右。

自定義CollectionTableSink

Apache Flink OLAP引擎性能優化及應用 12

這部分優化,源於OLAP的一個特性:OLAP會將最終計算結果發給客戶端,通過JobManager轉發給Client。假如某個query的結果數據量很大,會讓JobManager OOM ( OutOfMemory );如果同時執行多個query,也會相互影響。因此,我們從新實現了一個CollectionTableSink,限制數據的條數和數據大小,避免出現OOM,保證多個Query同時運行時的穩定性。

調度優化

Apache Flink OLAP引擎性能優化及應用 13

在Batch模式下的調度存在以下問題:

  • 使用Lazy_from_sources模式調度,會導致整體運行時間較長,也可能造成死鎖。

    注:調度死鎖是指在資源有限的情況下,多個Job同時運行時,如果多個Job都只申請到了部分資源並沒有剩餘資源可以申請,導致Job沒法繼續執行,新的Job也沒法提交

  • RM ( Resource Manager ) 按OnDemand方式分配Slot需求,也會造成死鎖

  • RM以單線程同步模式向TM ( Transaction Manager ) 分配Slot請求,會造成等待時間更長。

針對上述問題,我們提出了以下幾點改動:

  • 採用Eager調度模式 ( 確保所有的資源都申請到後才開始運行 )
  • 使用FIFO ( 先進先出隊 ) 模式申請資源 ( 確保當前Job的資源分配結束後才開始下一個Job的資源分配 )
  • 將單線程同步模式改為多線程異步模式,減少任務啟動時間和執行時間

② 針對source的優化

在ROLAP的執行場景中,所有數據都是通過掃描原始數據表後進行處理;因此,基於Source的讀取性能非常關鍵,直接影響Job的執行效率。

Project&Filter下堆

Apache Flink OLAP引擎性能優化及應用 14

像Parquet這類的列存文件格式,支持按需讀取相所需列,同時支持RowGroup級別的過濾。利用該特性,可以將Project和Filter下推到TableSource,從而只需要掃描Query中涉及的字段和滿足條件的RowGroup,大大提升讀取效率。

Aggregate下堆

Apache Flink OLAP引擎性能優化及應用 15

這個優化也是充分利用了TableSource的特性:例如Parquet文件的metadata中已經存儲了每個RowGroup的統計信息( 如max、min等),因此在做max、min這類聚合統計時,可直接讀取metadata信息,而不需要先讀取所有原始數據再計算。

③ 在沒有統計信息場景下做的優化

消除CrossJoin

Apache Flink OLAP引擎性能優化及應用 16

CrossJoin是沒有任何Join條件,將Join的兩張表的數據做笛卡爾積,導致Join的結果膨脹非常厲害,這類Join應該盡量避免。我們對含有CrossJoin的Plan進行改寫:將有join條件的表格先做join ( 通常會因為一些數據Join不上而減少數據 ),從而提高執行效率。這是一個確定性的改寫,即使在沒有統計信息的情況下,也可以使用該優化。

自適應的Local Aggregate

Apache Flink OLAP引擎性能優化及應用 17

通常情況下,兩階段的Aggregate是非常高效的,因為LocalAggregate能聚合大量數據,導致Shuffle的數據量會變少。但是當LocalAggregate的聚合度很低的時候, Local聚合操作的意義不大,反而會浪費CPU。在沒有任何統計信息的情況下,優化器沒法決定是否要產生LocalAggregate算子;因此,我們採用運行時採樣的方式來判斷聚合度,如果聚合度低於設定的閾值,我們將關閉聚合操作,改為僅做數據轉發;經我們測試,部分場景有30% 的性能提升。

3. 測試結果

Apache Flink OLAP引擎性能優化及應用 18

上圖是Flink和Presto基於1T數據做的SSB ( Star Schema Benchmark ) 測試,從圖中可以看出 Flink和Presto整體上不相上下,甚至有些Query Flink性能優於Presto。注:Flink OLAP從開始到嘉賓分享時,只有3個月時間。

Apache Flink OLAP引擎性能優化及應用 19

1. Apache Flink OLAP在數據探查上的應用

Apache Flink OLAP引擎性能優化及應用 20

上圖描述了一個數據湖應用的完整架構,Flink OLAP主要用於”數據探查”。數據探查是對數據結構做智能判斷,給出數據的探查結果,快速了解數據的信息和質量情況。即用戶可以在管控平台上了解數據湖中任意一份數據的數據特性。用戶通過Web交互操作選擇相應的表和指標後立即展示相關結果指標,因此要求低延遲、實時反饋。而且數據湖中很多數據沒有任何統計信息;前述的各種查詢、聚合層面的優化,主要為這類場景服務。

2. 整體架構

Apache Flink OLAP引擎性能優化及應用 21

上圖是這類應用的整體架構。整套服務託管到Kubernetes上,最終訪問的數據是OSS;目前這套架構正在阿里雲上做公測,邀請廣大用戶試用。

Apache Flink OLAP引擎性能優化及應用 22

Apache Flink OLAP引擎性能優化及應用 23

  • 推回社區:目前所有工作都是基於內部Flink,希望推回社區;
  • 資源隔離:後期很多功能的開發和優化會圍繞多Query運行時的”資源隔離”;
  • 優化&性能:圍繞OLAP的特性,在此場景下會進一步做優化和性能提升等方面的工作。

本次的分享就到這裡,謝謝大家。

本文來自 DataFunTalk

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247499058&idx=1&sn=219bf1398dcd8bc92ee83f1ca7049a31&chksm=fbd74f5ecca0c64880f93c34352659ba354e7a356ca588f8ac61d71a2fef76942de8b49fd256&scene=27#wechat_redirect