簡介:最佳實踐,以DLA爲例子。DLA致力於幫助客戶構建低成本、簡單易用、彈性的數據平臺,比傳統Hadoop至少節約50%的成本。其中DLA Meta支持雲上15+種數據數據源(OSS、HDFS、DB、DW)的統一視圖,引入多租戶、元數據發現,追求邊際成本爲0,免費提供使用。DLA Lakehouse基於Apache Hudi實現,主要目標是提供高效的湖倉,支持CDC及消息的增量寫入,目前這塊在加緊產品化中。DLA Serverless Presto是基於Apache PrestoDB研發的,主要是作聯邦交互式查詢與輕量級ETL。
數據湖當前在國內外是比較熱的方案,MarketsandMarkets _(https://www.marketsandmarkets.com/Market-Reports/data-lakes-market-213787749.html)_市場調研顯示預計數據湖市場規模在2024年會從2019年的79億美金增加到201億美金。一些企業已經構建了本身的雲原生數據湖方案,有效解決了業務痛點;還有不少企業在構建或者計劃構建本身的數據湖。Gartner 2020年發佈的報告顯示_(https://www.gartner.com/smarterwithgartner/the-best-ways-to-organize-your-data-structures/)_目前已經有39%的用戶在使用數據湖,34%的用戶考慮在1年內使用數據湖。隨着對象存儲等雲原生存儲技術的成熟,一開始你們會先把結構化、半結構化、圖片、視頻等數據存儲在對象存儲中。當須要對這些數據進行分析時,會選擇好比Hadoop或者阿里雲的雲原生數據湖分析服務DLA進行數據處理。對象存儲相比部署HDFS在分析性能上面有必定的劣勢,目前業界作了普遍的探索和落地。html
Wikipedia上說數據湖是一類存儲數據天然/原始格式的系統或存儲,一般是對象塊或者文件,包括原始系統所產生的原始數據拷貝以及爲了各種任務而產生的轉換數據,包括來自於關係型數據庫中的結構化數據(行和列)、半結構化數據(如CSV、日誌、XML、JSON)、非結構化數據(如email、文檔、PDF、圖像、音頻、視頻)。算法
從上面能夠總結出數據湖具備如下特性:sql
主要包括五個模塊:數據庫
對象存儲相比HDFS爲了保證高擴展性,在元數據管理方面選擇的是扁平的方式;元數據管理沒有維護目錄結構,所以能夠作到元數據服務的水平擴展,而不像HDFS的NameNode會有單點瓶頸。同時對象存儲相比HDFS能夠作到免運維,按需進行存儲和讀取,構建徹底的存儲計算分離架構。可是面向分析與計算也帶來了一些問題:緩存
上面這些是你們基於對象存儲構建數據湖分析方案遇到的典型問題。解決這些問題須要理解對象存儲相比傳統HDFS的架構區別進行鍼對性的優化。目前業界作了大量的探索和實踐:網絡
因爲對象存儲面向分析場景具備上面的問題,DLA構建了統一的DLA FS層來解決對象存儲元信息訪問、Rename、讀取慢等問題。DLA FS同時支持DLA的Serverless Spark進行ETL讀寫、DLA Serverless Presto數據交互式查詢、Lakehouse入湖建倉數據的高效讀取等。面向對象存儲OSS的架構優化總體分爲四層:架構
下面主要介紹DLA FS面向對象存儲OSS的優化技術:併發
在Hadoop生態中使用OutputCommitter接口來保證寫入過程的數據一致性,它的原理相似於二階段提交協議。less
開源Hadoop提供了Hadoop FileSystem的實現來讀寫OSS文件,它默認使用的OutputCommitter的實現是FileOutputCommitter。爲了數據一致性,不讓用戶看到中間結果,在執行task時先把結果輸出到一個臨時工做目錄,全部task都確認輸出完成時,再由driver統一將臨時工做目錄rename到生產數據路徑中去。以下圖:運維
因爲OSS相比HDFS它的Rename操做十分昂貴,是copy&delete操做,而HDFS則是NameNode上的一個元數據操做。在DLA的分析引擎繼續使用開源Hadoop的FileOutputCommitter性能不好,爲了解決這個問題,咱們決定在DLA FS中引入OSS Multipart Upload特性來優化寫入性能。
阿里雲OSS支持Multipart Upload功能,原理是把一個文件分割成多個數據片併發上傳,上傳完成後,讓用戶本身選擇一個時機調用Multipart Upload的完成接口,將這些數據片合併成原來的文件,以此來提升文件寫入OSS的吞吐。因爲Multipart Upload能夠控制文件對用戶可見的時機,因此咱們能夠利用它代替rename操做來優化DLA FS在OutputCommitter場景寫OSS時的性能。
基於Multipart Upload實現的OutputCommitter,整個算法流程以下圖:
利用OSS Multipart Upload,有如下幾個好處:
OSS Multipart Upload中控制用戶可見性的接口是CompleteMultipartUpload和abortMultipartUpload,這種接口的語義相似於commit/abort。Hadoop FileSystem標準接口沒有提供commit/abort這樣的語義。
爲了解決這個問題,咱們在DLA FS中引入Semi-Transaction層。
前面有提到過,OutputCommitter相似於一個二階段提交協議,所以咱們能夠把這個過程抽象爲一個分佈式事務。能夠理解爲Driver開啓一個全局事務,各個Executor開啓各自的本地事務,當Driver收到全部本地事務完成的信息以後,會提交這個全局事務。
基於這個抽象,咱們引入了一個Semi-Transaction層(咱們沒有實現全部的事務語義),其中定義了Transaction等接口。在這個抽象之下,咱們把適配OSS Multipart Upload特性的一致性保證機制封裝進去。另外咱們還實現了OSSTransactionalOutputCommitter,它實現了OutputCommitter接口,上層的計算引擎好比Spark經過它和咱們DLA FS的Semi-Transaction層交互,結構以下圖:
下面以DLA Serverless Spark的使用來講明DLA FS的OSSTransactionalOutputCommitter的大致流程:
引入DLA FS的Semi-Transaction,有兩個好處:
用戶反饋OSS請求費用高,甚至超過了DLA費用(OSS請求費用=請求次數×每萬次請求的單價÷10000)。調查發現,是由於開源的OSSFileSystem在讀取數據的過程當中,會按照512KB爲一個單位進行預讀操做。例如,用戶若是順序讀一個1MB的文件,會產生兩個對OSS的調用:第一個請求讀前512KB,第二個請求讀後面的512KB。這樣的實現就會形成讀大文件時請求次數比較多,另外因爲預讀的數據是緩存在內存裏面的,若是同時讀取的文件比較多,也會給內存形成一些壓力。
所以,在DLA FS的實現中,咱們去掉了預讀的操做,用戶調用hadoop的read時,底層會向OSS請求讀取從當前位置到文件結尾整個範圍的數據,而後從OSS返回的流中讀取用戶須要的數據並返回。這樣若是用戶是順序讀取,下一個read調用就天然從同一個流中讀取數據,不須要發起新的調用,即便順序讀一個很大的文件也只須要一次對OSS的調用就能夠完成。
另外,對於小的跳轉(seek)操做,DLA FS的實現是從流中讀取出要跳過的數據並丟棄,這樣也不須要產生新的調用,只有大的跳轉纔會關閉當前的流而且產生一個新的調用(這是由於大的跳轉讀取-丟棄會致使seek的延時變大)。這樣的實現保證了DLA FS的優化在ORC/Parquet等文件格式上面也會有減小調用次數的效果。
基於對象存儲OSS的存儲計算分離的架構,經過網絡從遠端存儲讀取數據仍然是一個代價較大的操做,每每會帶來性能的損耗。雲原生數據湖分析DLA FS中引入了本地緩存機制,將熱數據緩存在本地磁盤,拉近數據和計算的距離,減小從遠端讀取數據帶來的延時和IO限制,實現更小的查詢延時和更高的吞吐。
咱們把緩存的處理邏輯封裝在DLA FS中。若是要讀取的數據存在於緩存中,會直接從本地緩存返回,不須要從OSS拉取數據。若是數據不在緩存中,會直接從OSS讀取同時異步緩存到本地磁盤。
這裏以DLA Serverless Presto來講明如何提升DLA FS的local Cache的命中率提升。Presto默認的split提交策略是NO\_PREFERENCE,在這種策略下面,主要考慮的因素是worker的負載,所以某個split會被分到哪一個worker上面很大程度上是隨機的。在DLA Presto中,咱們使用SOFT\_AFFINITY提交策略。在提交Hive的split時,會經過計算split的hash值,儘量將同一個split提交到同一個worker上面,從而提升Cache的命中率。
使用\_SOFT\_AFFINITY\_策略時,split的提交策略是這樣的:
客戶在使用DLA過程當中,一般使用DLA Serverless Spark作大規模數據的ETL。咱們用TPC-H 100G數據集中的orders表進行寫入測試,新建一個以o\_ordermonth字段爲分區的orders\_test表。在Spark中執行sql:"insert overwrite table \`tpc\_h\_test\`.\`orders\_test\` select * from \`tpc\_h\_test\`.\`orders\`"。使用一樣的資源配置,使用的Spark版本一個爲開源Spark,另一個爲DLA Serverless Spark,將它們的結果進行對比。
從圖中能夠得出:
DLA客戶會使用DLA的Serverless Presto對多種格式進行分析,好比Text、ORC、Parquet等。下面對比基於DLA FS以及社區OSSFS在1GB Text及ORC格式的訪問請求次數。
1GB Text文件分析的請求次數對比
咱們針對社區版本prestodb和DLA作了性能對比測試。社區版本咱們選擇了prestodb 0.228版本,並經過複製jar包以及修改配置的方式增長對oss數據源的支持。咱們對DLA Presto CU版512核2048GB通社區版本集羣進行了對比。
測試的查詢咱們選擇TPC-H 1TB數據測試集。因爲TPC-H的大部分查詢並非IO密集型的,因此咱們只從中挑選出符合以下兩個標準的查詢來作比較:
按照這兩個標準,咱們選擇了對lineitem單個表進行查詢的Q1和Q6,以及lineitem和另外一個表進行join操做的Q四、Q十二、Q1四、Q1五、Q1七、Q19和Q20。
能夠看到Cache加速能管理在這幾個query都有明顯的效果。
最佳實踐,以DLA爲例子。DLA致力於幫助客戶構建低成本、簡單易用、彈性的數據平臺,比傳統Hadoop至少節約50%的成本。其中DLA Meta支持雲上15+種數據數據源(OSS、HDFS、DB、DW)的統一視圖,引入多租戶、元數據發現,追求邊際成本爲0,免費提供使用。DLA Lakehouse基於Apache Hudi實現,主要目標是提供高效的湖倉,支持CDC及消息的增量寫入,目前這塊在加緊產品化中。DLA Serverless Presto是基於Apache PrestoDB研發的,主要是作聯邦交互式查詢與輕量級ETL。DLA支持Spark主要是爲在湖上作大規模的ETL,並支持流計算、機器學習;比傳統自建Spark有着300%的性價比提高,從ECS自建Spark或者Hive批處理遷移到DLA Spark能夠節約50%的成本。基於DLA的一體化數據處理方案,能夠支持BI報表、數據大屏、數據挖掘、機器學習、IOT分析、數據科學等多種業務場景。
本文內容由阿里雲實名註冊用戶自發貢獻,版權歸原做者全部,阿里雲開發者社區不擁有其著做權,亦不承擔相應法律責任。具體規則請查看《阿里雲開發者社區用戶服務協議》和《阿里雲開發者社區知識產權保護指引》。若是您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將馬上刪除涉嫌侵權內容。