Spark Relational Cache实现亚秒级响应的交互式分析
本次分享主要分為以下四個方面:
一、項目介紹
項目背景
阿里云EMR是一個開源大數(shù)據(jù)解決方案,目前EMR上面已經(jīng)集成了很多開源組件,并且組件數(shù)量也在不斷的增加中。EMR下層可以訪問各種各樣的存儲,比如對象存儲OSS、集群內(nèi)部自建的HDFS以及流式數(shù)據(jù)等。用戶可以利用EMR處理海量數(shù)據(jù)和進(jìn)行快速分析,也能夠支持用戶在上面做機器學(xué)習(xí)以及數(shù)據(jù)清洗等工作。EMR希望能夠支撐非常大的業(yè)務(wù)數(shù)據(jù)量,同時也希望能夠在數(shù)據(jù)量不斷增長的時候,能夠通過集群擴容實現(xiàn)快速數(shù)據(jù)分析。
云上Adhoc數(shù)據(jù)分析痛點
在云上做Adhoc數(shù)據(jù)分析的時候,很難實現(xiàn)隨著數(shù)據(jù)量的增長使得查詢的延遲不會大幅度增加。雖然目前各種引擎不斷出現(xiàn),并且某些引擎在一些場景下運行很快,但是數(shù)據(jù)量變大之后,查詢響應(yīng)速度難免有所下降,因此希望在比較統(tǒng)一的平臺之上獲得較好的性能。與此同時,阿里云也希望能夠提供云原生的解決方案。Spark是目前工業(yè)界使用較多的計算引擎,應(yīng)用非常廣泛,但是在處理Adhoc上還是存在很多不足之處,因此阿里云在Spark上做了大量優(yōu)化,幫助用戶滿足Adhoc查詢的需求。因此就會涉及到緩存方案,雖然Spark中很早就有了緩存機制,但想要滿足云上Adhoc場景卻存在很多不足之處,因此阿里云會在Spark上做大量優(yōu)化,幫助用戶優(yōu)化Adhoc查詢速度。但是如果把數(shù)據(jù)放到內(nèi)存中,將所有數(shù)據(jù)全部用作緩存可能也不足夠,因此就催生出了Spark Relational Cache。
Spark Relational Cache
用戶的SQL請求過來之后,到了Spark上面,會需要比較長的時間在數(shù)據(jù)來源上進(jìn)行處理,這里下層的存儲包括集群的HDFS以及遠(yuǎn)端的JindoFS和阿里云OSS等。當(dāng)有了Spark Relational Cache之后,查詢過來之后會查詢是否能夠用到存儲在Relational Cache中緩存的數(shù)據(jù),如果不能用到則會轉(zhuǎn)發(fā)到原生路徑上,如果能用到則會用非常快的速度從緩存里面將數(shù)據(jù)讀取出來并將結(jié)果返回給用戶。因為Relational Cache構(gòu)建在高效存儲之上,通過用戶的DDL將數(shù)據(jù)變成Relational Cache。
Spark Relational Cache特點
Spark Relational Cache希望能夠達(dá)到秒級響應(yīng)或者亞秒級響應(yīng),能夠在提交SQL之后很快地看到結(jié)果。并且也支持很大的數(shù)據(jù)量,將其存儲在持久化的存儲上面,同時通過一些匹配手段,增加了匹配的場景。此外,下層存儲也使用了高效的存儲格式,比如離線分析都會使用的列式存儲,并且對于列式存儲進(jìn)行了大量優(yōu)化。此外,Relational Cache也是用戶透明的特性,用戶上來進(jìn)行查詢不需要知道幾個表之間的關(guān)系,這些都是已經(jīng)有過緩存的,不需要根據(jù)已有的緩存重寫Query,可以直接判斷是否有可以使用的Relational Cache,對于一個廠商而言只需要幾個管理員進(jìn)行維護(hù)即可。Spark Relational Cache支持自動更新,用戶不需要擔(dān)心因為插入了新的數(shù)據(jù)就使得Cache過時導(dǎo)致查詢到錯誤的數(shù)據(jù),這里面為用戶提供了一些設(shè)置的規(guī)則,幫助用戶去進(jìn)行更新。此外,Spark Relational Cache還在研發(fā)方面,比如智能推薦方面進(jìn)行了大量探索,比如根據(jù)用戶SQL的歷史可以推薦用戶基于怎樣的關(guān)系去建立Relational Cache。
二、技術(shù)分析
阿里云EMR具有很多核心技術(shù),如數(shù)據(jù)預(yù)計算、查詢自動匹配以及數(shù)據(jù)預(yù)組織。
數(shù)據(jù)預(yù)計算
數(shù)據(jù)在很多情況下都有一個模型,雪花模型是傳統(tǒng)數(shù)據(jù)庫中非常常見的模型,阿里云EMR添加了Primary Key/Foreign Key的支持,允許用戶通過Primary Key/Foreign Key明確表之間的關(guān)系,提高匹配成功率。在數(shù)據(jù)預(yù)計算方面,充分利用EMR Spark加強的計算能力。此外,還通過Data Cube數(shù)據(jù)立方來支持多維數(shù)據(jù)分析。
執(zhí)行計劃重寫
這部分首先通過數(shù)據(jù)預(yù)計算生成預(yù)計算的結(jié)果,并將結(jié)果存儲在外部存儲上,比如OSS、HDFS以及其他第三方存儲中,對于Spark DataSource等數(shù)據(jù)格式都支持,對于DataLake等熱門的存儲格式后續(xù)也會添加支持。在傳統(tǒng)數(shù)據(jù)庫中有類似的優(yōu)化方案,比如物化視圖方式,而在Spark中使用這樣的方式就不合適了,將邏輯匹配放在了Catalyst邏輯優(yōu)化器內(nèi)部來重寫邏輯執(zhí)行計劃,判斷Query能否通過Relational Cache實現(xiàn)查詢,并基于Relational Cache實現(xiàn)進(jìn)一步的Join或者組合。將簡化后的邏輯計劃轉(zhuǎn)化成為物理計劃在物理引擎上執(zhí)行。依托EMR Spark其他的優(yōu)化方向可以實現(xiàn)非常快速的執(zhí)行結(jié)果,并且通過開關(guān)控制執(zhí)行計劃的重寫。
自動查詢匹配
這里有一個簡單的例子,將三個表簡單地Join在一起,經(jīng)過過濾條件獲得最終的結(jié)果。當(dāng)Query過來之后先判斷Spark Relational Cache是否能夠符合需求,進(jìn)而實現(xiàn)對于預(yù)先計算好的結(jié)果進(jìn)行過濾,進(jìn)而得到最終想要的結(jié)果。
數(shù)據(jù)預(yù)組織
如果將數(shù)十T的數(shù)據(jù)存在存儲里面,那么從這個關(guān)系中獲取最終的結(jié)果還需要不少的時間,因為需要啟動不少的Task節(jié)點,而這些Task的調(diào)度也需要不少的開銷,通過文件索引的方式將時間開銷壓縮到秒級水平,可以在執(zhí)行時過濾所需要讀取的文件總量,這樣大大減少了任務(wù)的數(shù)量,這樣執(zhí)行的速度就會快很多。因為需要讓全局索引變得更加有效,因此最好讓數(shù)據(jù)是排過序的,如果對于結(jié)構(gòu)化數(shù)據(jù)進(jìn)行排序就會知道只是對于排列在第一位的Key有一個非常好的優(yōu)化效果,對于排列在后面的Key比較困難,因此引入了ZOrder排序,使得列舉出來的每個列都具有同等的效果。同時將數(shù)據(jù)存儲在分區(qū)表里,使用GroupID作為分區(qū)列。
三、如何使用
DDL
對于簡單的Query,可以指定自動更新的開關(guān),并起一個名字方便后續(xù)管理。還可以規(guī)定數(shù)據(jù)Layout的形式,并最終通過SQL語句來描述關(guān)系,后續(xù)提供給用戶WebUI一樣的東西,方便用戶管理Relational Cache。
數(shù)據(jù)更新
Relational Cache的數(shù)據(jù)更新主要有兩種策略,一種是On Commit,比如當(dāng)依賴的數(shù)據(jù)發(fā)生更新的時候,可以將所有需要添加的數(shù)據(jù)都追加寫進(jìn)去。還有一種默認(rèn)的On Demand形式,用戶通過Refresh命令手動觸發(fā)更新,可以在創(chuàng)建的時候指定,也可以在創(chuàng)建之后手工調(diào)整。Relational Cache增量的更新是基于分區(qū)實現(xiàn)的,后續(xù)會考慮集成一些更加智能的存儲格式,來支持行級別的更新。
四、性能分析
Cube構(gòu)建
阿里巴巴的EMR Spark對于1T數(shù)據(jù)的構(gòu)建時間只需要1小時。
查詢性能
在查詢性能方面,SSB平均查詢耗時,無Cache時查詢 時間按Scale成比例增加,Cache Cube后始終保持在亞秒級響應(yīng)。
阿里云雙11領(lǐng)億元補貼,拼手氣抽iPhone 11 Pro、衛(wèi)衣等好禮,點此參與:http://t.cn/Ai1hLLJT
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Spark Relational Cache实现亚秒级响应的交互式分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跑得好好的Java进程,怎么突然就瘫痪了
- 下一篇: 优酷背后的大数据秘密