摘要: MaxCompute是一套阿里自主研發的數據倉庫解決方案。產品除了功能、性能、簡單等優點外,還能在費用上節省下一大筆前。墨跡天氣使用MaxCompute,除了性能和穩定性也有提高外,總體存儲和計算的費用比以前節省70%。這是如何作到的呢,這裏有一些經常使用的規則。html
原文連接:http://click.aliyun.com/m/43695/web
MaxCompute是一套阿里自主研發的數據倉庫解決方案。產品除了功能、性能、簡單等優點外,還能在費用上節省下一大筆前。墨跡天氣使用MaxCompute,除了性能和穩定性也有提高外,總體存儲和計算的費用比以前節省70%。這是如何作到的呢,這裏有一些經常使用的規則。算法
在討論如何作到以前,咱們先看下MaxCompute是如何計費的。根據目前的文檔,目前的計費方式包含數據的存儲、數據的下載以及計算費用。其中計算費用又分I/O後付費和預付費兩種收費模式。I/O後付費根據實際的計算來進行收費;而預付費至關於包了幾個CU只有購買者可使用,這幾個CU上隨便怎麼計算都不會產生計算費用。因此如何減小費用,也就是轉換成如何減小存儲的費用、如何減小下載的費用以及如何減小計算的費用。sql
存儲架構
數據存儲在MaxCompute上是使用列式存儲並有壓縮的,底層數據存儲方式不須要用戶本身維護。可是用戶能夠經過減小存儲在MaxCompute上的數據量來減小存儲的費用。能夠經過及時刪除不須要的數據來減小存儲費用。這裏須要推薦用一個叫生命週期(lifecycle)的功能來定時回收過時的數據。設置了生命週期後,若是是分區表,分區表裏的某個分區若是在指定的時間內數據沒發生變動,系統會認爲這個分區已經不須要了,會自動刪除這個分區。若是是非分區表的話,指定的時間內沒有數據變化就會刪除這整張表。這個功能能夠用來配置到一些歷史記錄表上,好比說若是不想要一年以前的歷史記錄,能夠把表根據寫入時間作分區,而後設置生命週期爲一年。數據寫入的時候,天天數據只寫入到當天的那個分區裏。一年後,以前的數據由於一全年都沒有數據寫入,觸發生命週期的條件,並後臺定時做業刪除對應的分區裏的數據。性能
在實際使用中,除了由於沒及時刪除過時不要的歷史記錄形成的額外的存儲費用外,更多的是由於對數據的管理不到位致使的一些不須要的表一直沒刪除致使的空間佔用。仔細想一想,在作查詢的時候使用Create table xx as select先存了一些臨時表,用好沒刪除一直放着佔用從存儲空間,這種事情應該每一個人都作過一些。可是若是你真的要去找找哪些數據須要刪除,哪些數據是業務數據不能動的時候,對着list tables;出來的幾百幾千張表也是很無從下手吧。對數據倉庫作好分層,作好命名規範,對於每一層根據使用須要配置不一樣的生命週期回收策略,用一個好的數據管理來保證數據倉庫的表的有序存儲,不只能節省一筆存儲的錢,也能在實際使用的時候,快速找到須要的表,便於數據的管理和使用。而若是有一些計算過程產生的臨時表,後續又肯定用不到的,能夠在計算結束及時刪除。具體能夠參考禕休寫的基於阿里雲數加的企業大數據倉庫架構建設思路有比較詳細的說明。大數據
下載優化
下載數據並不是所有都會收費的,有一些狀況下數據下載也不會產生費用。合理利用這些規則,選擇正確的下載方式就能減小下載的費用(並且下載不收費的方式也正好是下載最快的方式)。具體的規則能夠參考文檔。阿里雲
另外下載的費用,還和下載的文件的大小有關係。經過合理的表結構設置和數據生成方式,把每次須要下載的數據放到一張表(或一個分區)裏,減小下載量也是減小費用的一種策略。好比說須要下載3年級的學生信息的時候,下載所有的學生信息後再執行過濾,確定比不過先根據年級對學生進行分區,而後只下載3年級的分區來的方法好。htm
計算
計算裏須要注意的相對會多一些。不過咱們仍是先看看計算的費用和什麼有關。先說I/O後付費,如今暫時還只是收取了SQL的費用,因此本文也只講SQL的部分。看到SQL的費用是根據輸入的數據量和SQL的算法複雜度有關的。
計算引擎在計算的時候,合理設置表的分區字段能夠減小數據的輸入量。關於分區能夠參考這裏。計算引擎在作執行計劃解析的時候,若是發現查詢過濾條件是用分區字段作過濾的時候,能夠只讀計算涉及的分區的數據,從而減小輸入的數據量。
除了減小輸入的數據量,減小計算複雜度也是一種方法。算法複雜度的優化通常涉及到代碼層面的優化,並且有時候須要和業務結合起來。好比前面已經有過一些數據預處理知道本次計算的數據某個字段沒有重複,那此次計算的時候就能夠少加一次distinct或者group by。經過代碼層面結合業務邏輯,一塊兒優化SQL語句減小計算的複雜度,是減小計算費用的一種方法。
另外減小計算的次數也是一種方法。好比某幾個計算都須要用到某個實時表的數據,並且都是在某種過濾和彙總以後的再加工,那徹底能夠把中間能夠複用的計算過程保存下來,在數據倉庫上作適量的輕度彙總甚至高度彙總。後續的計算能夠拿彙總數據再作進一步的計算。這樣雖然中間多存了一些數據,可是後續的計算的時候能夠少算一些邏輯。這是數據倉庫裏常常用到的空間換時間的方法。配合以前提到的生命週期,能夠用最小的存儲費用的代價得到最大的計算費用的減小。固然合理利用這種方法,除了能夠減小計算費用外,由於減小重複計算,也能夠減小計算的時間提升效率。
除了以上提到的這些,也能夠考慮後付費的方式來跑計算,也就是計算費用是包年包月的。通常來講,知足如下條件能夠考慮使用後付費
任務大部分是週期任務,任務量比較均勻。若是任務以偶發性的臨時查詢爲主可能不合適用後付費
任務的提交事件比較分散,若是都集中在某個時間點一塊兒算的,也不太合適
通過一段時間的試運行,任務數量已經基本能夠估計,不會短時間內有比較的明顯的增長或者減小
若是不知足這些 條件,者很容易出如今高峯期購買的CU不夠用,任務出現排隊;低谷的時候資源又利用不起來,形成浪費。
其餘
關於費用,其實還有兩個很是關鍵的問題
1.我天天都花了多少錢,如何優化?
能夠參考這裏,看看天天的帳單,經過檢查裏面的計算、存儲和下載分別產生了多少費用。從而從對應的角度去作優化。另外也能夠在表格裏作金額的排序,看看金額最高的幾筆費用是什麼費用,看看可否針對性作一些優化。
2.我這個SQL提交後會產生多少費用?
若是產生的費用都不清楚,那提交一個SQL時內心是沒底的。在大數據開發套件的數據開發裏,跑SQL會跳出消費提醒,從而提早知道提交後會產生的費用。若是發現金額特別高,能夠考慮先作一些優化後再提交以避免產生沒必要要的費用。若是是直接在MaxCompute客戶端裏跑SQL的話,能夠用cost sql ;估算SQL的費用。
識別如下二維碼,閱讀更多幹貨