精打细算使用MaxCompute搭建数仓
摘要: MaxCompute是一套阿里自主研發(fā)的數(shù)據(jù)倉庫解決方案。產(chǎn)品除了功能、性能、簡單等優(yōu)勢外,還能在費(fèi)用上節(jié)省下一大筆前。墨跡天氣使用MaxCompute,除了性能和穩(wěn)定性也有提升外,整體存儲和計(jì)算的費(fèi)用比之前節(jié)省70%。這是如何做到的呢,這里有一些常用的規(guī)則。
原文鏈接:http://click.aliyun.com/m/43695/
MaxCompute是一套阿里自主研發(fā)的數(shù)據(jù)倉庫解決方案。產(chǎn)品除了功能、性能、簡單等優(yōu)勢外,還能在費(fèi)用上節(jié)省下一大筆前。墨跡天氣使用MaxCompute,除了性能和穩(wěn)定性也有提升外,整體存儲和計(jì)算的費(fèi)用比之前節(jié)省70%。這是如何做到的呢,這里有一些常用的規(guī)則。
在討論如何做到之前,我們先看下MaxCompute是如何計(jì)費(fèi)的。根據(jù)目前的文檔,目前的計(jì)費(fèi)方式包含數(shù)據(jù)的存儲、數(shù)據(jù)的下載以及計(jì)算費(fèi)用。其中計(jì)算費(fèi)用又分I/O后付費(fèi)和預(yù)付費(fèi)兩種收費(fèi)模式。I/O后付費(fèi)根據(jù)實(shí)際的計(jì)算來進(jìn)行收費(fèi);而預(yù)付費(fèi)相當(dāng)于包了幾個(gè)CU只有購買者可以使用,這幾個(gè)CU上隨便怎么計(jì)算都不會產(chǎn)生計(jì)算費(fèi)用。所以如何減少費(fèi)用,也就是轉(zhuǎn)換成如何減少存儲的費(fèi)用、如何減少下載的費(fèi)用以及如何減少計(jì)算的費(fèi)用。
存儲
數(shù)據(jù)存儲在MaxCompute上是使用列式存儲并有壓縮的,底層數(shù)據(jù)存儲方式不需要用戶自己維護(hù)。但是用戶可以通過減少存儲在MaxCompute上的數(shù)據(jù)量來減少存儲的費(fèi)用。可以通過及時(shí)刪除不需要的數(shù)據(jù)來減少存儲費(fèi)用。這里需要推薦用一個(gè)叫生命周期(lifecycle)的功能來定時(shí)回收過期的數(shù)據(jù)。設(shè)置了生命周期后,如果是分區(qū)表,分區(qū)表里的某個(gè)分區(qū)如果在指定的時(shí)間內(nèi)數(shù)據(jù)沒發(fā)生變更,系統(tǒng)會認(rèn)為這個(gè)分區(qū)已經(jīng)不需要了,會自動刪除這個(gè)分區(qū)。如果是非分區(qū)表的話,指定的時(shí)間內(nèi)沒有數(shù)據(jù)變化就會刪除這整張表。這個(gè)功能可以用來配置到一些歷史記錄表上,比如說如果不想要一年之前的歷史記錄,可以把表根據(jù)寫入時(shí)間做分區(qū),然后設(shè)置生命周期為一年。數(shù)據(jù)寫入的時(shí)候,每天數(shù)據(jù)只寫入到當(dāng)天的那個(gè)分區(qū)里。一年后,之前的數(shù)據(jù)因?yàn)橐徽甓紱]有數(shù)據(jù)寫入,觸發(fā)生命周期的條件,并后臺定時(shí)作業(yè)刪除對應(yīng)的分區(qū)里的數(shù)據(jù)。
在實(shí)際使用中,除了因?yàn)闆]及時(shí)刪除過期不要的歷史記錄造成的額外的存儲費(fèi)用外,更多的是因?yàn)閷?shù)據(jù)的管理不到位導(dǎo)致的一些不需要的表一直沒刪除導(dǎo)致的空間占用。仔細(xì)想想,在做查詢的時(shí)候使用Create table xx as select先存了一些臨時(shí)表,用好沒刪除一直放著占用從存儲空間,這種事情應(yīng)該每個(gè)人都做過一些。但是如果你真的要去找找哪些數(shù)據(jù)需要刪除,哪些數(shù)據(jù)是業(yè)務(wù)數(shù)據(jù)不能動的時(shí)候,對著list tables;出來的幾百幾千張表也是很無從下手吧。對數(shù)據(jù)倉庫做好分層,做好命名規(guī)范,對于每一層根據(jù)使用需要配置不同的生命周期回收策略,用一個(gè)好的數(shù)據(jù)管理來保證數(shù)據(jù)倉庫的表的有序存儲,不僅能節(jié)省一筆存儲的錢,也能在實(shí)際使用的時(shí)候,快速找到需要的表,便于數(shù)據(jù)的管理和使用。而如果有一些計(jì)算過程產(chǎn)生的臨時(shí)表,后續(xù)又確定用不到的,可以在計(jì)算結(jié)束及時(shí)刪除。具體可以參考祎休寫的基于阿里云數(shù)加的企業(yè)大數(shù)據(jù)倉庫架構(gòu)建設(shè)思路有比較詳細(xì)的說明。
下載
下載數(shù)據(jù)并非全部都會收費(fèi)的,有一些情況下數(shù)據(jù)下載也不會產(chǎn)生費(fèi)用。合理利用這些規(guī)則,選擇正確的下載方式就能減少下載的費(fèi)用(而且下載不收費(fèi)的方式也正好是下載最快的方式)。具體的規(guī)則可以參考文檔。
另外下載的費(fèi)用,還和下載的文件的大小有關(guān)系。通過合理的表結(jié)構(gòu)設(shè)置和數(shù)據(jù)生成方式,把每次需要下載的數(shù)據(jù)放到一張表(或一個(gè)分區(qū))里,減少下載量也是減少費(fèi)用的一種策略。比如說需要下載3年級的學(xué)生信息的時(shí)候,下載全部的學(xué)生信息后再執(zhí)行過濾,肯定比不過先根據(jù)年級對學(xué)生進(jìn)行分區(qū),然后只下載3年級的分區(qū)來的方法好。
計(jì)算
計(jì)算里需要注意的相對會多一些。不過我們還是先看看計(jì)算的費(fèi)用和什么有關(guān)。先說I/O后付費(fèi),現(xiàn)在暫時(shí)還只是收取了SQL的費(fèi)用,所以本文也只講SQL的部分。看到SQL的費(fèi)用是根據(jù)輸入的數(shù)據(jù)量和SQL的算法復(fù)雜度有關(guān)的。
計(jì)算引擎在計(jì)算的時(shí)候,合理設(shè)置表的分區(qū)字段可以減少數(shù)據(jù)的輸入量。關(guān)于分區(qū)可以參考這里。計(jì)算引擎在做執(zhí)行計(jì)劃解析的時(shí)候,如果發(fā)現(xiàn)查詢過濾條件是用分區(qū)字段做過濾的時(shí)候,可以只讀計(jì)算涉及的分區(qū)的數(shù)據(jù),從而減少輸入的數(shù)據(jù)量。
除了減少輸入的數(shù)據(jù)量,減少計(jì)算復(fù)雜度也是一種方法。算法復(fù)雜度的優(yōu)化一般涉及到代碼層面的優(yōu)化,而且有時(shí)候需要和業(yè)務(wù)結(jié)合起來。比如前面已經(jīng)有過一些數(shù)據(jù)預(yù)處理知道本次計(jì)算的數(shù)據(jù)某個(gè)字段沒有重復(fù),那這次計(jì)算的時(shí)候就可以少加一次distinct或者group by。通過代碼層面結(jié)合業(yè)務(wù)邏輯,一起優(yōu)化SQL語句減少計(jì)算的復(fù)雜度,是減少計(jì)算費(fèi)用的一種方法。
另外減少計(jì)算的次數(shù)也是一種方法。比如某幾個(gè)計(jì)算都需要用到某個(gè)實(shí)時(shí)表的數(shù)據(jù),而且都是在某種過濾和匯總之后的再加工,那完全可以把中間可以復(fù)用的計(jì)算過程保存下來,在數(shù)據(jù)倉庫上做適量的輕度匯總甚至高度匯總。后續(xù)的計(jì)算可以拿匯總數(shù)據(jù)再做進(jìn)一步的計(jì)算。這樣雖然中間多存了一些數(shù)據(jù),但是后續(xù)的計(jì)算的時(shí)候可以少算一些邏輯。這是數(shù)據(jù)倉庫里經(jīng)常用到的空間換時(shí)間的方法。配合之前提到的生命周期,可以用最小的存儲費(fèi)用的代價(jià)獲得最大的計(jì)算費(fèi)用的減少。當(dāng)然合理利用這種方法,除了可以減少計(jì)算費(fèi)用外,因?yàn)闇p少重復(fù)計(jì)算,也可以減少計(jì)算的時(shí)間提高效率。
除了以上提到的這些,也可以考慮后付費(fèi)的方式來跑計(jì)算,也就是計(jì)算費(fèi)用是包年包月的。一般來說,滿足以下條件可以考慮使用后付費(fèi)
任務(wù)大部分是周期任務(wù),任務(wù)量比較均勻。如果任務(wù)以偶發(fā)性的臨時(shí)查詢?yōu)橹骺赡懿缓线m用后付費(fèi)
任務(wù)的提交事件比較分散,如果都集中在某個(gè)時(shí)間點(diǎn)一起算的,也不太合適
經(jīng)過一段時(shí)間的試運(yùn)行,任務(wù)數(shù)量已經(jīng)基本可以估計(jì),不會短期內(nèi)有比較的明顯的增加或者減少
如果不滿足這些 條件,者很容易出現(xiàn)在高峰期購買的CU不夠用,任務(wù)出現(xiàn)排隊(duì);低谷的時(shí)候資源又利用不起來,造成浪費(fèi)。
其他
關(guān)于費(fèi)用,其實(shí)還有兩個(gè)非常關(guān)鍵的問題
1.我每天都花了多少錢,如何優(yōu)化?
可以參考這里,看看每天的賬單,通過檢查里面的計(jì)算、存儲和下載分別產(chǎn)生了多少費(fèi)用。從而從對應(yīng)的角度去做優(yōu)化。另外也可以在表格里做金額的排序,看看金額最高的幾筆費(fèi)用是什么費(fèi)用,看看能否針對性做一些優(yōu)化。
2.我這個(gè)SQL提交后會產(chǎn)生多少費(fèi)用?
如果產(chǎn)生的費(fèi)用都不清楚,那提交一個(gè)SQL時(shí)心里是沒底的。在大數(shù)據(jù)開發(fā)套件的數(shù)據(jù)開發(fā)里,跑SQL會跳出消費(fèi)提醒,從而提前知道提交后會產(chǎn)生的費(fèi)用。如果發(fā)現(xiàn)金額特別高,可以考慮先做一些優(yōu)化后再提交以免產(chǎn)生不必要的費(fèi)用。如果是直接在MaxCompute客戶端里跑SQL的話,可以用cost sql ;估算SQL的費(fèi)用。
識別以下二維碼,干貨
總結(jié)
以上是生活随笔為你收集整理的精打细算使用MaxCompute搭建数仓的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球云端数据仓库领导者 MaxCompu
- 下一篇: AliOS Things SIG BLE