如何在數據中臺中提高效率並節省成本?

来源:https://www.cnblogs.com/JavaEdge/archive/2023/07/27/17586169.html
-Advertisement-
Play Games

上節討論瞭如何保障數據中台的數據質量,讓數據“準”。除了“快”和“準”,數據中台還離不開“省”。隨數據規模越來越大,成本越來越高,如不合理控製成本,還沒等你挖掘出數據應用價值,企業利潤就被消耗完。 能否做到精細化成本管理,關乎數據中台項目成敗。 某電商業務數據建設資源增長趨勢(CU= 1vcpu + ...


上節討論瞭如何保障數據中台的數據質量,讓數據“準”。除了“快”和“準”,數據中台還離不開“省”。隨數據規模越來越大,成本越來越高,如不合理控製成本,還沒等你挖掘出數據應用價值,企業利潤就被消耗完。

能否做到精細化成本管理,關乎數據中台項目成敗。

某電商業務數據建設資源增長趨勢(CU= 1vcpu + 4G memory):

某電商平臺的大數據資源消耗增長趨勢,2019全年資源規模25000CU,全年機器預算3500W。對創業企業顯然不小開支。

一天,數據團隊負責人李好看被CEO叫到了辦公室:

  • 這3500W花在什麼業務?
  • 你們做了哪些成本優化的舉措,效果如何?

把李問懵,他心想:團隊的成本是按機器又不是數據應用核算。在數據中臺中,數據應用之間的底層數據是復用的,那具體每個數據產品或者報表花了多少錢,自己沒有這樣的數據啊,咋可能知道。

可對CEO這些很重要,因為資源有限,他須確保資源都用在戰略目標的關鍵節點。如電商團隊今年核心KPI是提升單個註冊會員在平臺的消費額,老闆角度,他須確保資源都投入與KPI相關業務,如基於數據對註冊會員精準化營銷,提升會員在平臺的消費額。

自己所在的團隊是否發生過類似的事情? 數據部門是企業的成本中心,如要展現自己的價值:

  • 支撐好業務,獲得業務的認可
  • 精簡成本,為公司省錢

所以,今天重點在省錢,聊數據中台的精細化成本管理。

1 成本陷阱

一開始建設數據中台時,你往往會關註新業務的接入,數據的整合,數據價值的挖掘上,忽略成本管控的問題,從而落入陷阱中,造成成本爆炸式的增長。所以,有必要深入瞭解有哪些陷阱,儘量在日常開發中避免。

這裡總結8種陷阱:

  • 1~3廣泛存在,但易被忽略
  • 4~8涉及數據開發中一些技能,開發時註意就可

“知其然,更要知其所以然”,才能發現問題本質,深入掌握解決問題的方法。

1.1 數據上線容易,下線難

某數據中台項目,表相關的使用統計。一半的表30d內都沒有訪問,而這些表占26%存儲。如把這些表的產出任務單獨拎出,高峰期需消耗5000Core CPU計算資源,換算成伺服器需125台(按一臺伺服器可分配CPU 40Core計算),成本一年近500W。自己竟然有這麼多無用數據?我經常把數據比作手機中的圖片,我們不斷拍照生圖,卻懶得清,最終手機存儲經常不夠。

無法及時清數據,數據開發也有苦衷。他們不知道一個表:

  • 還有哪些任務在引用
  • 還有哪些人在查詢

自然不敢停止這個表的數據加工,導致數據上線易,下線難。

1.2 低價值的數據應用消耗了大量的資源

數據看上去每天都被訪問,但究竟產出多少價值,ROI值得嗎?

有個寬表(擁有很多列的表,經常出現在數據中臺下游的彙總層數據中),加上上游加工鏈路的任務,每天加工這張寬表要消耗6000塊錢,一年200W,可追查後我們發現,這張寬表實際每天只有一個人在使用,還是一個運營的實習生。顯然,投入和產出極不匹配。

間接說明,數據部門比較關註新的數據產品帶給業務的價值,卻忽略已存產品或報表是否還存在價值,最終導致低價值的應用仍大量耗資源。

1.3 煙囪式的開發模式

不僅研發效率低,因數據重覆加工,還資源浪費。一張500T表,加工這表,計算任務需高峰期消耗300Core,摺合7台伺服器(按一臺伺服器可分配CPU 40Core計算),加上存儲盤成本(按照0.7 元/TB*天計算),一年消耗40W。

而這張表每復用一次,就可節省40W。所以模型復用,還可實現省錢。

第四,數據傾斜。

數據傾斜會讓任務性能變差,也會浪費大量的資源,那什麼是數據傾斜呢?

單Stage階段Spark任務數據分片運行圖

你肯定聽說過木桶效應吧?一個木桶裝多少水,主要取決於最短的那塊板。對於一個分散式並行計算框架來說,這個效應同樣存在。對於Spark計算引擎來說,它可以將海量的數據切分成不同的分片(Partition),分配到不同機器運行的任務中,進行並行計算,從而實現計算能力水平擴展。

但是整個任務的運行時長,其實取決於運行最長的那個任務。因為每個分片的數據量可能不同,每個任務需要的資源也不相同。由於不同的任務不能分配不同的資源,所以,總任務消耗資源=max{單個任務消耗的資源} * 任務數量。這樣一來,數據量小的任務會消耗更多的資源,就會造成資源的浪費。

我們還是舉個電商場景的例子。

假設你需要按照商戶粒度統計每個商戶的交易金額,此時,我們需要對訂單流水錶按照商戶進行group by計算。在平臺上,每個商戶的訂單交易量實際差距很大,有的訂單交易量很多,有的卻比較少。

img

我們利用Spark SQL完成計算過程。

數據傾斜示意圖

在上圖中,任務A 讀取了左邊某個分片的數據,按照供應商進行聚合,然後輸出給下一個Stage的B、C、D任務。

你可以看到,聚合後,B、C和D任務輸入的數據量有很大的不同,B處理的數據量比C和D多,消耗的記憶體自然更多,假設單個Executor需要分配16G,而B、C、D不能設置不同的記憶體大小,所以C和D也都設置了16G。可實際上,按照C和D的數據量,只需要4G就夠了。這就造成了C和D 任務資源分配的浪費。

第五,數據未設置生命周期。

06講中,我強調,一般原始數據和明細數據,會保留完整的歷史數據。而在彙總層、集市層或者應用層,考慮到存儲成本,數據建議按照生命周期來管理,通常保留幾天的快照或者分區。如果存在大表沒有設置生命周期,就會浪費存儲資源。

第六,調度周期不合理。

img

通過這張圖你可以看到,大數據任務的資源消耗有很明顯的高峰和低谷效應,一般晚上12點到第二天的9點是高峰期,9點到晚上12點,是低谷期。

雖然任務有明顯的高峰低谷效應,但是伺服器資源不是彈性的,所以就會出現伺服器在低谷期比較空閑,在高峰期比較繁忙的情況,整個集群的資源配置取決於高峰期的任務消耗。所以,把一些不必要在高峰期內運行任務遷移到低谷期運行,也可以節省資源的消耗。

第七,任務參數配置。

任務參數配置的不合理,往往也會浪費資源。比如在Spark中,Executor 記憶體設置的過大;CPU設置的過多;還有Spark 沒有開啟動態資源分配策略,一些已經運行完Task的Executor 不能釋放,持續占用資源,尤其是遇到數據傾斜的情況,資源浪費會更加明顯。

第八,數據未壓縮。

Hadoop 的HDFS 為了實現高可用,預設數據存儲3副本,所以大數據的物理存儲量消耗是比較大的。尤其是對於一些原始數據層和明細數據層的大表,動輒500多T,摺合物理存儲需要1.5P(三副本,所以實際物理存儲5003),大約需要16台物理伺服器(一臺伺服器可分配存儲按照128T計算),如果不啟用壓縮,存儲資源成本會很高。

另外,在Hive或者Spark 計算過程中,中間結果也需要壓縮,可以降低網路傳輸量,提高Shuffer (在Hive或者Spark 計算過程中,數據在不同節點之間的傳輸過程)性能。

你看,我為你列舉了8個典型的成本陷阱,那你可能會問了,老師,我已經中招了,該怎麼辦呢? 別急,接下來我們就看一看,如何進行精細化的成本管理。

2 如何實現精細化成本管理?

成本治理應遵循全局盤點、發現問題、治理優化和效果評估四步。

2.1 全局資產盤點

對數據中臺中,所有的數據進行一次全面盤點,基於元數據中心提供的數據血緣,建立全鏈路的數據資產視圖。

img

全鏈路數據資產視圖:

  • 下游末端關聯到數據應用(報表:財務分析)
  • 上游起點是剛進入數據中台的原始數據
  • 數據之間通過任務進行連接

計算全鏈路數據資產視圖中,末端數據的成本和價值(末端數據就是加工鏈路最下游的表,例如圖中TableA,Table G)。

為什麼一定要從末端開始? 因為中間數據在計算價值時,還要考慮下游表被使用的情況,較難計算清楚,所以從末端數據開始。這與下線表的順序也一致,如數據的價值很低,成本很高,也從末端數據開始下線。

數據成本該如何計算?

對上圖中財務分析報表核算成本,這報表上游鏈路中涉及a,b,c,3個任務,A,B,C,D,E,F, 6張表:

這張報表的成本=3個任務加工消耗的計算資源成本+6張表消耗的存儲資源的成本。

如一個表被多個下游應用復用,那這個表的存儲資源成本以及產出任務消耗的成本,需分攤給多個應用。

那價值又該如何計算?

如末端數據是一張應用層的表,它對接的是一個數據報表,那衡量這數據價值主要看報表的使用範圍和使用頻率。

計算使用範圍時,通常用周活評估,同時還要考慮不同管理級別的人權重,對老闆,他一個人權重可相當1000個普通員工。所以這樣設計考慮到管理級別越高,做出商業決策影響越大,自然價值越大。使用頻率一般使用單個用戶每周查看報表的次數來衡量,次數越高,說明報表價值越大。

如末端數據對接的不是一個數據報表,而是面向特定場景的數據應用(比如我之前提到過的供應鏈分析決策系統,它面向的人群主要是供應鏈部門)。衡量這類產品的價值,主要考慮目標人群的覆蓋率和直接業務價值產出。什麼是直接業務價值產出呢?,在供應鏈決策系統中,就是通過系統自動生成的採購訂單占所有採購訂單的比例。

末端數據可能還是一張集市層的表,主要用於提供給分析師做探索式查詢。這類表的價值看它被哪些分析師使用,使用頻率。使用範圍評估時,也要對分析師按級別加權。

2.2 發現問題

全局盤點為發現問題提供數據支撐,關註:

  • 持續產生成本,但已沒有使用的末端數據(一般指30天內無訪問)

    沒有使用,但一直在消耗成本的表,對應的就是我提到的陷阱1

  • 數據應用價值很低,成本卻很高,這些數據應用上游鏈路上的所有相關數據

    低價值產出,高成本的數據應用,對應的是陷阱2

  • 高峰期高消耗的數據

    高成本的數據,對應陷阱4~8

陷阱3實際是在第6節模型設計中解決的。

2.3 治理優化

針對這三類問題制訂相應策略。

第一類,應對錶下線。 數據下線要謹慎,參考數據下線的執行過程圖:

末端數據刪除後,原先末端數據的上游數據會成為新的末端數據,同樣還要按發現問題到治理優化進行重覆,直到所有的末端數據都不滿足下線策略為止。

對第二類問題,我們需要按照應用粒度評估應用是否還有存在的必要。對於報表,可以按照30天內沒有訪問的應用自動下線的策略,先對報表進行銷毀,然後對報表上游的表進行下線,如果該表還被其他的應用引用,就不能下線。下線步驟可以參考前面的下線步驟。

第三類問題,主要是針對高消耗的數據,又具體分為產出數據的任務高消耗和數據存儲高消耗。對於產出任務高消耗,首先要考慮是不是數據傾斜。具體怎麼判斷呢?其實你可以通過MR或者Spark日誌中,Shuffer的數據量進行判斷。如果有某一個Task 數據量非常大,其他的很少,就可以判定出現了數據傾斜。

圖 Spark task shuffer records:

圖 MR reduce task records:

數據傾斜處理?

不同的場景有一些適用的解決方案:

  • 如一些大表和小表關聯時,Key分佈不均造成數據傾斜,可使用mapjoin
  • 較通用的處理方式,如把熱點Key單獨處理,然後對剩下的Key進行處理,然後對結果進行並集

推薦閱讀

除數據傾斜,還應該查任務的配置參數。如Spark執行引擎:

  • Executor個數是否過大
  • executor-cores和executor-memory是否過多,利用率較低

一般executors-memorty 設4G-8G,executor-cores設2-4個(實踐過利用率最高的配置項)。

還要考慮任務是否真有必要在高峰期執行,可根據集群負載情況,儘量將任務遷移到非高峰期執行,“削峰填谷”。

上面幾點是產出任務高消耗的情況。

對存儲消耗比較大的任務,先考慮是否要壓縮,尤其對原始數據層和明細數據層,建議壓縮

壓縮方式

  • 小文件的壓縮,不考慮split,gzip較合適
  • 大文件,推薦lzo,支持split,在保證壓縮效率前提下,有相對穩定壓縮比

還要考慮生命周期是否設置:

  • ODS原始數據層和DWD 明細數據層,適合用永久保留策略
  • 一些商品、用戶維表,可考慮3、5年保留策略

整體上,底層表都是長期保留。關註重點應是彙總層以上的表(包括彙總層),一般可根據數據的重要性,制訂7天,1個月保留策略。

治理效果評估

量化治理成果 - 省了多少錢

若直接拿伺服器數量來衡量,不能真實反應治理效果,因為還要考慮業務增長原因,可圍繞任務和數據的成本考慮:

  • 下線了多少任務和數據
  • 這些任務每日消耗了多少資源
  • 數據占用了多少存儲空間

拿這些資源來計算成本,就能算出省了多少錢。如開頭案例,任務A運行3h,在運行過程中,共消耗5384503 cpu*s,37007892 GB *s, 假設我們1個CU (1 cpu, 4g memeory)一年是1300元成本,摺合每天為3.5元(計算公式為1300/365)。

不論是優化或下線任務,只統計高峰時間段內,因為優化低峰時間無法實際節省資源。

高峰時間段為8h,那摺合每s費用0.00012153,則該任的費用為max{5384503*0.00012153, 37007892/4 * 0.00012153} = max{654, 1124} = 1124 。下線這任務後節省1124元,再加上表A占用的存儲空間大小乘以每GB的成本,可得數據表A下線節省費用。

成本治理中心

成本治理不是一勞永逸的工作,需要持之以恆,不斷發現問題,然後治理優化,建立長久運行機制的前提是必須降低成本治理的門檻,接下來,看一下網易的一個成本治理的平臺,EasyCost。

系統提供了數據診斷的功能,可以按照訪問時間、訪問頻率、關聯的應用,設置下線策略,支持一鍵灰度下線,大幅提高了管理的效率。

可通過系統化方式沉澱到產品,然後通過產品提高管理效率,實現治理機制的長久落地。

總結

通過數據中台:

  • 可獲得大數據作為資產中心帶來的紅利
  • 也可能陷入成本的深淵,為野蠻增長的大數據費用買單

從常見成本陷阱入手,分析可能造成成本浪費的原因,然後介紹精細化成本管理的方法,最後強調:

  • 無用數據的下線應該從全鏈路數據資產視圖的末端入手,然後抽絲剝繭,一層一層,向數據加工鏈路的上游推進。
  • 應用層表的價值應該以數據應用的價值來衡量,對於低價值產出的應用,應該以應用為粒度進行下線。
  • 對高消耗任務的優化只要關註集群高峰期的任務,項目的整體資源消耗只取決於高峰期的任務消耗,當然,如果你使用的是公有雲的資源,可以高峰和低谷實施差異化的成本結算,那低谷期的也是要關註的。

FAQ

在數據中台的集市層,存在一些大寬表,幾百個欄位,上游可能數十個表,如計算這個表的成本會非常高。這表中,欄位訪問頻率不同,優化這張寬表?

  1. 垂直切分:將寬表按照欄位的訪問頻率劃分,將訪問頻率高的欄位單獨劃分為一張表,訪問頻率低的欄位單獨劃分為一張表。這樣可以減少查詢時掃描的欄位數,提高查詢效率

  2. 水平切分:將寬表按照行進行切分,將每個切分後的表中的欄位數控制在可接受的範圍內,這樣可以減少單個表的欄位數,提高查詢效率

  3. 建立索引:對於寬表中的訪問頻率高的欄位,可以建立索引,這樣可以加快查詢速度

  4. 緩存機制:對於查詢頻率高的數據,可以採用緩存機制,將數據緩存在記憶體中,這樣可以減少查詢時間

  5. 數據壓縮:對於寬表中的冷數據,可以採用數據壓縮技術,減少存儲空間,提高查詢效率

可根據實際情況選擇合適的優化方式來提高查詢效率。

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文從為什麼需要WebAssembly、WebAssembly的工作原理、哪些語言可用來創建WebAssembly模塊、WebAssembly可以用在哪裡 以及 怎麼使用 幾方面簡要介紹了webAssembly。如果之前沒有瞭解過webAssembly,可以做一些簡要的瞭解。 ...
  • # Jenkins-Pipline原理 > 本文僅探討jenkins pipline 的原理,是流水線的一個demo版本實現,不能代表Jenkins pipline的具體實現,僅供參考。 ## 1. Jenkins流水線介紹 Jenkinsfile流水線是Jenkins CI/CD工具中用來定義、構 ...
  • 在武俠世界里,“利器”通常指的是武器中的上乘、出色之物;武器對於武者的重要性不言而喻,擁有一把優秀的武器可以讓武者在戰鬥中更加得心應手,威力更強。在分散式系統追求高可用的背景下,熔斷、限流和降級這三個重要的策略可以稱得上三大利器。降級和熔斷是不是一回事?限流 與 降級呢? ...
  • 1. 介紹 阿裡巴巴 Arthas 是一個診斷工具,可以用於監視、分析和解決 Java 應用程式的問題。使用 Arthas 的一個主要優點是,我們不需要修改代碼,甚至不需要重新啟動我們想要監視的 Java 服務。 在本教程中,我們將首先安裝 Arthas,在此之後,通過一個簡單的案例來演示 Arth ...
  • Mac/Win 最新 IntelliJ IDEA 2023.2 激活破解教程,附激活碼(持續更新~),適用於 JetBrains 全家桶的所有工具。 ...
  • 部署容器是使用Docker和容器化管理應用程式更高效、易於擴展和確保跨環境一致性性能的關鍵步驟。本主題將為您概述如何部署Docker容器以創建和運行應用程式。 ## 概述 Docker容器是輕量級、可移植且自我包含的環境,可以運行應用程式及其依賴項。部署容器涉及啟動、管理和擴展這些隔離的環境,以便順 ...
  • ## 開篇介紹 Java 8 中新增的特性旨在幫助程式員寫出更好的代碼,其中對核心類庫的改進是很關鍵的一部分,也是本章的主要內容。對核心類庫的改進主要包括集合類的 API 和新引入的流(Stream),流使程式員得以站在更高的抽象層次上對集合進行操作。下麵將介紹stream流的用法。 ## 1.初始 ...
  • # 同步電路與非同步電路 - ## 同步電路 - 電路中所有觸發器均連接同一個時鐘脈衝源,觸發器的狀態變化均與時鐘脈衝信號同步; - 電路中所有時鐘同源同相; - 同相位時鐘:始終頻率不同,但是時鐘邊沿對齊; - ![](https://img2023.cnblogs.com/blog/1964011 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...