如何用好雲原生數據湖?

導讀:數據湖可以很好地幫助企業應對當前數據場景越來越多、數據結構越來越複雜、數據處理需求越來越多樣化的問題。阿里雲從2018年起就開始佈局數據湖,推出了雲原生數據湖分析Data Lake Analytics(DLA),從數據湖管理(幫助客戶高效管理構建數據湖),Serverless Spark(提供高性價比的大規模計算),Serverless SQL(提供高性價比的在線交互式分析)三個方面幫助客戶挖掘數據價值。本文分享相關技術挑戰及解決方案。


一、數據湖的機遇與挑戰

數據湖可以很好地幫助企業應對當前數據場景越來越多、數據結構越來越複雜、數據處理的需求越來越多樣化的問題。Gartner 2020年發佈的報告顯示目前已經有39%的用戶在使用數據湖,34%的用戶考慮在1年內使用數據湖。

從2018年起,阿里雲就開始佈局數據湖,推出了雲原生數據湖分析Data Lake Analytics(簡稱:DLA)產品,結合對象存儲OSS一起,從彈性擴展、按需付費、服務化等方面打造有競爭力的產品。通過採用存儲計算分離模式,存儲和計算完全按需付費,用戶只需要爲實際產生價值的計算買單;DLA深度定製雲原生彈性能力,實現作業級彈性,一分鐘可彈300個節點。雲原生數據湖分析DLA從成本、彈性、交付能力方面相對傳統數據分析方案,獲得了較大的提升。

在雲上也已經有數千家企業使用數據湖服務滿足數據應用,如友盟+ 的U-DOP數據開放平臺根據友盟+多年沉澱的大數據領域經驗,形成了以APP、WEB、小程序、廣告營銷、社會化分享和推送爲基礎的多端主題數據的採集和處理能力,爲客戶形成規範化的多端數據資產。尤其是利用了數據湖的彈性能力,應對了雙十一峯值期間DAU暴漲的業務變化,例如,通過實施分析搜索關鍵詞的變化,改變首頁廣告推薦信息,對活躍用戶和下單用戶分不同渠道的分析梳理,及時調整優惠策略,以吸引更多的客戶新購及復購等。

數據庫與大數據一體化趨勢在加強,傳統的數據庫使用者與DBA,也可以使用及維護大數據系統,一體化解決大數據的問題。具體在DLA體現在數據庫的數據無縫與大數據結合,比如DLA提供的一鍵入湖建倉的功能;DLA Serverless SQL兼容MySQL協議及部分語法。

DLA Serverless產品形態,開發者只需要使用平臺接口即可,如使用DLA SQL的JDBC接口提交SQL,使用DLA Spark的OpenAPI提交Spark作業。開發者只需要關注業務邏輯本身,不需要關心平臺的複雜邏輯。原來使用開源組件遇到的很多痛點都可以迎刃而解:

入門門檻高

Hadoop生態往往需要多個組件同時使用,比如Yarn、HDFS、Spark、Hive、Kerberos、Zookeeper等等。開發者需要了解所有組件,因爲開發過程中這些組件往往都會接觸到。

開發維護困難

開發者在開發過程中會遇到各個組件帶來的使用問題,開發者需要了解所有這些組件以應對這些問題。這些加重了開發者的使用負擔。

穩定性難以保障

開源組件本身都必須經過細緻的調參並加上合適的硬件資源配置,才能良好運行,並且需要修復不少BUG,出現問題沒有兜底。

缺乏適應雲的性能優化

雲上的OSS、PolarDB等組件都是雲原生的組件,開源組件對這部分的改造適應不足,沒有充分挖掘出更高的性能。

DLA從數據湖管理(幫助客戶高效管理構建數據湖),Serverless Spark(提供高性價比的大規模計算),Serverless SQL(提供高性價比的在線交互式分析)三個方面幫助客戶挖掘數據價值。整體架構如下所示。接下來,本文將從這三個方面,分別講述相關技術挑戰以及解決方案。



二、如何管理與構建數據湖

數據湖中數據難以管理主要體現在兩個方面:

  1. 已經在數據湖存儲OSS上面的數據如何高效的構建元數據。
  2. 非OSS數據如何高效的入湖建倉。

數據湖管理相關的主要功能包括元數據管理、元數據發現、數據庫入湖建倉、實時數據入湖。接下來重點介紹“海量文件元數據自動構建技術”和“入湖建倉數據管理技術”兩個關鍵技術。

01 海量文件元數據自動構建技術

當以OSS作爲數據湖存儲,存儲的數據文件具有以下幾個特性:

  • 格式豐富:包括CSV、Text、JSON、Parquet、Orc、Avro、hudi、Delta Lake等格式,其中CSV、Text又包含多種自定義的分隔符等。

  • 文件數在百萬級別:OSS的擴展性及性價比較好,用戶存儲在OSS的文件會是百萬級別。

  • 文件動態上傳:存儲在OSS上面數據文件具有動態持續上傳的特性,新的文件如何快速增量修改元數據。

爲了高效的爲OSS上面的海量數據構建元數據,阿里雲DLA提出並實現了“海量文件元數據自動構建技術”。具體技術如下圖所示,核心解決了:萬表萬分區識別、增量感知更新元數據兩個問題。

萬表萬分區識別

用戶OSS上面的文件數量會到百萬級別,這些文件不僅格式不同,比如JSON、CSV、Text等,而且同一種格式由於業務屬性不同具體的Schema字段也不一樣。該技術通過文件Schema識別器搭配文件分類器支持自動生成萬表萬分區。其中文件Schema識別器比如針對JSON單文件識別到0.15s、CSV單文件識別0.2s,搭配可插拔的智能採樣策略及分佈式策略,百萬文件的Schema識別可以到分鐘級別。文件分類器通過樹的結構進行聚合、剪枝、壓縮,百萬級別文件的分類識別需要290ms左右。

增量感知更新
用戶會往OSS上面持續不斷的上傳文件,元數據自動構建既要把屬於已經創建表的文件Schema變化更新到已有的表,同時對獨立新增的文件創建新的表。這裏一方面“文件Schema識別器”通過獲取OSS上面文件的增加、刪除變化對變化的文件進行識別,同時“文件分類器”對新增的文件Schema和已經創建的表進行對別生成變化策略,目前支持增加分區、增加字段、字段不更改、不感知文件刪除4種策略,後續可以持續添加新的策略。

02 入湖建倉數據組織技術

把DataBase及消息日誌服務的數據統一存儲到數據湖存儲OSS進行管理,能夠滿足計算加速、構建數倉歸檔、冷熱分離等業務需求。DLA的入湖建倉數據組織技術包括三種數據組織管理模式:鏡像模式、分區模式、增量模式,三種模式能夠搭配友好支持這些業務場景。

鏡像模式

每次全量同步源庫一個Database下面所有表的數據到數據湖存儲OSS之上,同步期間可以做到源庫負載增加控制在10%以內。這裏主要使用了全局統一數據分片調度算法。保持數據湖的數據和源庫一致。

分區模式

面對歸檔場景支持按天全量及增量同步源庫數據到數據湖,並以時間分區的方式進行組織,方便歸檔管理。這種模式能夠做到小時級別的時間延遲。

增量模式

這種模式通過行列混存技術、commitlog及index管理技術,可以做到T+10min的數據入湖。其中通過delta的增量文件及異步compaction技術解決了小文件問題;通過delta增量文件及索引技術可以支持Database場景更新、刪除日誌的增量實時寫入;通過commitlog的方式記錄分區文件的映射,解決百萬分區在傳統Catalog管理模式性能慢的問題。

三、雲原生數據湖平臺需打通雲基礎設施

DLA整體是一個多租戶的架構,分Region部署,每個Region的用戶共享一套控制邏輯。虛擬集羣VC是邏輯的隔離單元。平臺支持 Serverless Spark、Serverless SQL等引擎,打造雲原生服務。

如上圖所示,平臺主要面臨的挑戰有:資源高效供給、安全防護、訪問數據源的帶寬保障。

01 資源高效供給

雲原生平臺基於阿里雲的底座ECS&ACK&ECI,與阿里雲IAAS資源大池打通,本Region跨可用區資源調度,保障資源的供給。支持1分鐘彈300個節點,單客戶在大Region 5w計算節點資源的保障。

02 安全防護

用戶可以寫任意的代碼平臺內運行,可能是故意惡性的攻擊行爲,如果沒有任何保護,則平臺面臨安全危險。在安全方面,我們通過如下技術保障安全性:

  • 一次密鑰:每個Job任務都會去TokenServer申請臨時的Token,Job失效Token會過期,如果存在攻擊行爲,則平臺會直接讓Token過期,則訪問Meta等服務會被拒絕。

  • 預防DDOS&注入攻擊:所有的訪問平臺服務的請求,都會對接到安全防護中心,安全防護中心檢測有任何攻擊或者注入行爲,直接關閉網絡端口。

  • 計算容器隔離:計算節點間採用阿里雲自研的安全容器,容器本身可以實現VM相同的安全隔離級別。

  • 安全白名單:用戶互相之間的網絡是完全隔離的。

  • ENI虛擬網卡:打通VPC需要配置自己賬號下的安全組和虛擬交換機(VSwitch),配置之後結算節點容器會分配用戶VPC對應VSwitch網段的的IP,並掛載用戶的安全組。

03 高吞吐網絡帶寬

  • 訪問OSS服務是通過高吞吐的帶寬服務。

  • 使用ENI技術訪問自持VPC,跟在自持VPC內ECS上部署計算引擎訪問自持VPC內數據一樣,帶寬同樣是VPC內網帶寬。

四、Serverless Spark服務的技術挑戰

Apache Spark是目前社區最爲流行的開源引擎,不但具備流、SQL、機器學習以及圖等計算能力,也可以連接豐富的數據源。但是,面對數據湖場景,傳統集羣版Spark方案,除了面臨前面提到的數據管理困難、運維成本、計算資源彈性能力不足、企業級能力弱等問題外,還面臨訪問OSS的性能不佳、複雜作業難以調試等問題。

藉助於第二章節提到的數據湖管理機制,可以很好地解決數據管理難題。藉助於第三章節提到的多租戶安全平臺,DLA Spark實現了全新的雲原生Serverless產品形態,很好地解決了彈性問題、運維成本問題以及企業級需求問題。本章節對Spark訪問OSS的性能優化以多租戶UI服務做進一步展開。

01 Spark訪問OSS優化

社區版本的問題

開源版Spark訪問OSS數據默認採用Hadoop FileFormat接口直接對接OSSFileSystem實現。該方法在實踐中發現存在性能差,一致性難以保證等問題。

(1)Spark訪問OSS性能差

核心原因在於OSS KV模型跟HDFS文件樹模型的差異。FileFormat算法最初設計是基於HDFS文件系統,然而對象存儲如OSS,爲了解決擴展性,本質上採用的是KV模型。KV模型相對於HDFS文件系統差異較大,比如RenameDirectory接口,在HDFS中只是指針操作,但在KV中,需要將所有子文件和目錄的KV執行Rename,性能開銷很大,並且保證不了原子性。Hadoop FileOutputFormat在寫入數據的時候先寫到臨時目錄,最後寫入最終目錄,臨時目錄到最終目錄的過程中需要做文件樹合併,合併過程中有大量Rename操作。

(2)一致性難保證

FileFormat v1算法中,合併文件樹操作全部在AppMaster單點執行,效率非常低,尤其是動態分區場景。爲了解決AppMaster單點,社區提供了算法2,其核心思路是將合併過程並行到Task中執行,在性能上會有一定的提高,但是,如果Job執行失敗,部分成功的Task會將數據寫入最終數據目錄,導致髒數據問題。

Spark OSS訪問優化

(1)基於MultipartUpload的FileOutputFormat實現

針對Spark訪問OSS的特點,我們全新實現了Hadoop FileOutputFormat接口,如上圖所示。算法的改進重點在優化合並操作,合併的核心是解決文件何時可見的問題。OSS提供MultipartUpload接口,也就是斷點續傳功能,文件可以分片上傳,上傳沒有結束,分片文件是不可見的。藉助該特性,我們可以讓Task直接將數據寫入到最終目錄,只有作業成功才讓文件最終可見,該方法不用先寫入臨時目錄,也就大大減少了元數據的操作。對於執行失敗的Task寫入的臨時分片,我們在作業結束時,執行Abort操作,就可以將其刪除,這也就降低了空間佔用。

針對Spark典型ETL Benchmark Terasort,在1TB輸入數據量的情況下,DLA FileOutputFormat執行時間縮短62%,性能提升163%。而針對動態分區場景,社區算法1運行失敗,算法2可以執行成功,DLA FileOutputFormat算法相比算法2性能還要進一步提升124%。

(2)OSS元數據Cache

Spark讀取OSS的過程中,在ResolveRelation階段,Spark會遍歷OSS的目錄,解析表結構和分區結構,以及解析Schema,該過程中同樣會有大量元數據操作,並且同一個OSS 對象的元數據會被訪問多次。針對該問題,我們實現了對OSS元數據的緩存,第一次訪問到的OSS對象元數據就會被緩存到本地,後續如果訪問該對象直接讀取本地緩存。這種方式可以最大限度降低對OSS元數據的訪問。Cache機制可以讓ResolveRelation有1倍左右的性能提升,針對典型的Spark查詢場景,該機制整體可以提升60%的性能。

02 多租戶UI服務

UI服務對於開發者來說至關重要,開發人員依賴UI服務進行作業調試,以及生產作業的問題排查。好的UI服務可以很好地加速研發效率。

HistoryServer的痛點

Spark社區提供HistoryServer提供對Spark歷史作業的UI和日誌服務,在實際應用中遇到諸多痛點,典型如下:

(1)Eventlog空間開銷大

HistoryServer依賴Spark引擎將運行中的Event信息全部記錄到FileSystem中,然後後臺回放並繪出UI頁面。對於複雜作業和長作業Eventlog量較大,可以達到百GB甚至TB級別。

(2)複雜作業和長作業不支持

複雜作業或者長作業的Eventlog很大,HistoryServer會解析失敗,甚至OOM。再加上空間開銷大的原因,用戶一般都只能關閉Eventlog。

(3)Replay效率差,延遲高

HistoryServer採用後臺Replay Eventlog的方式還原Spark UI,相當於把Spark引擎的事件全部重放一遍,開銷大,會有延遲。特別是作業較多或者較複雜的情況下,延遲可達分鐘甚至十分鐘級別。

DLA多租戶SparkUI

SparkUI服務是DLA平臺自研的多租戶UI服務,針對社區方案做了深度優化:

(1)去Eventlog

DLA Spark去掉了Eventlog依賴,在作業結束的時候,Spark Driver只是dump UI的Meta到OSS,保存作業結束前的頁面元信息。這部分信息只是相對於Eventlog來說,會大大減少,即使非常複雜的作業也只有MB級別。UiServer讀取OSS上的UI Meta,將其反序列化出來即可展示SparkUI頁面。

(2)UIServer水平擴展

UIServer主要負責解析歷史UI Meta和提供Stderr和Stdout日誌服務,是輕量化,無狀態的,可以實現水平擴展,進而支持萬級別客戶同時在線服務。UIServer URL採用加密token作爲參數,token代表的用戶身份,作業id,UIServer據此實現多租戶服務化。

(3)本地日誌自動滾動

對於長作業而言,Stderr或者Stdout信息會隨着時間增加累積,最終甚至可能打爆磁盤。DLA Spark安全容器內置後臺進程,實現日誌滾動,保存最有價值的最近一段時間的日誌。

五、Serverless SQL服務的技術挑戰

DLA Serverless SQL是基於目前託管於Linux基金會之下的PrestoDB打造的雲原生數據湖引擎,Alibaba同時也是Presto基金會成員之一,一直在貢獻優化Presto。PrestoDB引擎本身具有優秀的特性:

  • 全內存計算帶來的極致速度。

  • 支持完整SQL語義帶來的強大表達力。

  • 易用的插件機制使得我們可以對任何數據源進行關聯查詢。

  • 強大的社區使得我們使用之後沒有後顧之憂。

不過社區PrestoDB是單租戶的一個引擎,它假定你是在一個公司內部使用,因此算力隔離、高可用等等方面沒有過多投入,這使得要直接使用它來作爲雲原生服務的引擎存在幾個問題:

  • 一個用戶如果提交大量大查詢將可能佔用集羣所有資源,導致其它用戶無法使用。

  • 單Coordinator使得整個服務的可用性無法得到保證。

我們做了一系列的優化、改造使得它可以雲原生的形態服務所有的用戶,今天着重介紹多租戶隔離技術以及多Coordinator兩個主要的特性。

首先我們看一下DLA Serverless SQL的整體架構:

我們在覈心的PrestoDB集羣周邊建設了諸如接入層、統一元數據等等服務來使得用戶可以用得穩定、用得便利,下面我們將在多租戶隔離技術和多Coordinator技術的介紹中詳細剖析。

01 多租戶隔離技術

PrestoDB原生是有資源組的支持,它可以支持在不同資源組間做一定程度的CPU、內存的限制,但是它有一些問題使得我們無法基於它來實現計算力的隔離:

  • 全局調度層面:即使一個租戶使用了過多的計算力資源也不會及時被懲罰,只有新查詢會被Block。

  • Worker調度層面:所有租戶的Split是在同一個隊列裏面進行調度,一個租戶如果有過多Split會影響其它租戶。

我們的計算力多租戶方案如下:

我們在集羣中引入了一個ResourceManager的模塊用於從所有的Coordinator收集所有租戶的資源使用信息,ResourceManager把收集到的資源使用信息跟我們預設的計算力的閾值進行對比,計算出哪些租戶應該被懲罰,然後把這個懲罰信息通知到所有的Worker。Worker在進行調度的時候會參照ResourceManager通知過來的懲罰信息決定哪些租戶的查詢得到調度,哪些租戶的查詢不進行調度。這樣不同的租戶之間算力就會得到隔離,我們測試瞭如果有一個租戶過量使用資源,它會在最長1.3秒之內得到懲罰,從而釋放資源給其它租戶,而社區默認版本的“懲罰”要等到租戶所有的查詢執行完成纔會到來。只有元數據和計算力得到隔離,我們才能放心用一個集羣來服務我們所有的用戶。

02 Multi-Coordinator技術

社區版本的Presto裏面,Coordinator是一個單點,它會帶來兩個方面的問題:

  • 可用性隱患: 一旦Coordinator宕機、整個集羣將不可用達5到10分鐘。

  • 無法實現無縫升級,升級過程中影響所有用戶的查詢使用。

我們採取瞭如下的架構方案:

首先我們在Presto的Coordinator之上放置了一個新的FrontNode模塊,讓用戶連接到這個模塊,而不是直接連接到我們底層的Coordinator,這樣我們底層到底有多少個Coordinator,現在哪個Coordinator在給用戶提供服務都對用戶完全透明,這樣架構上就比較靈活,從而方便我們在底層對Coordinator進行擴展。

FrontNode在接收到用戶的查詢之後會把請求按照Round Robin的方式發送給底層的多個Coordinator,這樣多個Coordinator就可以分擔壓力,但是整個集羣還是有一些全局的事情要有單個Coordinator來做,比如Presto的Worker狀態監控、OOM Killer等等,因此我們引入了一個Zookeeper來做Coordinator選主的事情,選主之後主Coordinator的職責會跟社區的Presto類似:做全局的Worker狀態監控、OOM Killer以及執行分配給它的查詢;從Coordinator的職責則比較輕量級: 只負責執行分配給它的查詢。

如果其中一個Coordinator因爲任何問題宕機,Zookeeper會在秒級發現這個問題並重新選主,用戶受到影響的查詢只要重試即可。而且我們正在做的一個嘗試是做查詢的自動重試,對於確定是系統原因造成的失敗我們做自動重試,這樣一個Coordinator對用戶的影響將會很小。

而有了多Coordinator的架構,我們要實現無縫升級就非常簡單了,我們在升級的時候只要主動把某個Coordinator/Worker從集羣中摘除,進行升級,升級完成再加入集羣,客戶可以毫不感知,因爲在升級過程中始終有一個正常工作的集羣在給用戶提供服務, 比如我們在升級從Coordinator的時候,整個集羣情況如下:

通過諸如多租戶隔離技術、多Coordinator架構等等優化,我們基於PrestoDB打造了可以服務所有的用戶的阿里云云原生數據湖Serverless SQL引擎。

六、雲原生數據湖端到端最佳實踐

如上圖方案所示,DLA提供了端到端的方案,面對OSS數據開放性帶來的管理及入湖困難,DLA數據湖管理,幫助您一站式構建安全數據湖。

  • 提供統一開放的Meta服務對OSS數據進行管理,支持庫表權限。

  • 利用元數據爬取功能,可以一鍵創建OSS上的元數據信息,輕鬆自動識別CSV/JSON/Parquet等格式,建立好庫表信息,方便後續計算引擎使用。

  • 一鍵將RDS/PolarDB/MongoDB等數據庫的數據同步到OSS存儲當中,搭建冷熱數據分層的業務架構,對多源海量數據進行數據洞察分析。

  • 支持流式構建Hudi格式,滿足T+10分鐘的延遲要求,極大提升分析的端到端的延遲。

  • Serverless化SQL分析,幫助您即開即用數據湖。用戶無需購買任何資源,即可運行標準的SQL語法查詢數據。

  • 支持對數據湖存儲OSS Cache加速,提升10倍的性能。

  • 支持RDS、PolarDB、ADB、MongoDB數據十種數據源的分析。

  • 對比傳統的Presto、Impala方案提升10x的性價比提升。

  • Serverless化Spark計算,幫助您自主玩轉數據湖。用戶無需購買任何資源,即可使用雲原生的Spark服務,支持OSS 數PB的數據清洗、機器學習、用戶可編程,玩轉數據湖。

  • 每分鐘可彈出500個節點參與計算。

  • 對比傳統的自建Spark方案提升3x的性價比提升。


文章來源:阿里技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章