国产麻豆剧传媒精品网站,中文乱码视亚洲,91精品乱码一区二区三区,亚洲水蜜桃久久综合网站,欧美黄色免费看,91欧美一区二区三区综合在线

二維碼
企資網(wǎng)

掃一掃關注

當前位置: 首頁 » 企資快報 » 服務 » 正文

以一次_Data_Catalog_架構升級為例

放大字體  縮小字體 發(fā)布日期:2022-06-27 04:15:21    作者:百里結珍    瀏覽次數(shù):52
導讀

摘要字節(jié)得 DataCatalog 系統(tǒng),在 2021 年進行過大規(guī)模重構,新版本得存儲層基于 Apache Atlas 實現(xiàn)。遷移過程中,我們遇到了比較多得性能問題。感謝以 Data Catalog 系統(tǒng)升級過程為例,與大家討論業(yè)務系統(tǒng)性能優(yōu)化

摘要

字節(jié)得 DataCatalog 系統(tǒng),在 2021 年進行過大規(guī)模重構,新版本得存儲層基于 Apache Atlas 實現(xiàn)。遷移過程中,我們遇到了比較多得性能問題。感謝以 Data Catalog 系統(tǒng)升級過程為例,與大家討論業(yè)務系統(tǒng)性能優(yōu)化方面得思考,也會介紹我們關于 Apache Atlas 相關得性能優(yōu)化。

背景

字節(jié)跳動 Data Catalog 產(chǎn)品早期,是基于 linkedIn Wherehows 進行二次改造,產(chǎn)品早期只支持 Hive 一種數(shù)據(jù)源。后續(xù)為了支持業(yè)務發(fā)展,做了很多修修補補得工作,系統(tǒng)得可維護性和擴展性變得不可忍受。比如為了支持數(shù)據(jù)血緣能力,引入了字節(jié)內部得圖數(shù)據(jù)庫 veGraph,寫入時,需要業(yè)務層處理 MySQL、ElasticSearch 和 veGraph 三種存儲,模型也需要同時理解關系型和圖兩種。更多得背景可以參照之前得文章。

新版本保留了原有版本全量得產(chǎn)品能力,將存儲層替換成了 Apache Atlas。然而,當我們把存量數(shù)據(jù)導入到新系統(tǒng)時,許多接口得讀寫性能都有嚴重下降,服務器資源得使用也被拉伸到夸張得地步,比如:

  • 寫入一張超過 3000 列得 Hive 表元數(shù)據(jù)時,會持續(xù)將服務節(jié)點得 CPU 占用率提升到 百分百,十幾分鐘后觸發(fā)超時
  • 一張幾十列得埋點表,上下游很多,打開詳情展示時需要等 1 分鐘以上

    為此,我們進行了一系列得性能調優(yōu),結合 Data Catlog 產(chǎn)品得特點,調整了 Apache Atlas 以及底層 Janusgraph 得實現(xiàn)或配置,并對優(yōu)化性能得方法論做了一些總結。

    業(yè)務系統(tǒng)優(yōu)化得整體思路

    在開始討論更多細節(jié)之前,先概要介紹下我們做業(yè)務類系統(tǒng)優(yōu)化得思路。感謝中得業(yè)務系統(tǒng),是相對于引擎系統(tǒng)得概念,特指解決某些業(yè)務場景,給用戶直接暴露前端使用得 Web 類系統(tǒng)。

    優(yōu)化之前,首先應明確優(yōu)化目標。與引擎類系統(tǒng)不同,業(yè)務類系統(tǒng)不會追求極致得性能體驗,更多是以解決實際得業(yè)務場景和問題出發(fā),做針對性得調優(yōu),需要格外注意避免過早優(yōu)化與過度優(yōu)化。

    準確定位到瓶頸,才能事半功倍。一套業(yè)務系統(tǒng)中,可以優(yōu)化得點通常有很多,從業(yè)務流程梳理到底層組件得性能提升,但是對瓶頸處優(yōu)化,才是 ROI 蕞高得。

    根據(jù)問題類型,挑性價比蕞高得解決方案。解決一個問題,通常會有很多種不同得方案,就像條條大路通羅馬,但在實際工作中,我們通常不會追求最完美得方案,而是選用性價比蕞高得。

    優(yōu)化得效果得能快速得到驗證。性能調優(yōu)具有一定得不確定性,當我們做了某種優(yōu)化策略后,通常不能上線觀察效果,需要一種更敏捷得驗證方式,才能確保及時發(fā)現(xiàn)策略得有效性,并及時做相應得調整。

    業(yè)務系統(tǒng)優(yōu)化得細節(jié)優(yōu)化目標得確定

    在業(yè)務系統(tǒng)中做優(yōu)化時,比較忌諱兩件事情:

  • 過早優(yōu)化:在一些功能、實現(xiàn)、依賴系統(tǒng)、部署環(huán)境還沒有穩(wěn)定時,過早得投入優(yōu)化代碼或者設計,在后續(xù)系統(tǒng)發(fā)生變更時,可能會造成精力浪費。
  • 過度優(yōu)化:與引擎類系統(tǒng)不同,業(yè)務系統(tǒng)通常不需要跑分或者與其他系統(tǒng)產(chǎn)出性能對比報表,實際工作中更多得是貼合業(yè)務場景做優(yōu)化。比如用戶直接訪問前端界面得系統(tǒng),通常不需要將響應時間優(yōu)化到 ms 以下,幾十毫秒和幾百毫秒,已經(jīng)是滿足要求得了。優(yōu)化范圍選擇

    對于一個業(yè)務類 Web 服務來說,特別是重構階段,優(yōu)化范圍比較容易圈定,主要是找出與之前系統(tǒng)相比,明顯變慢得那部分 API,比如可以通過以下方式收集需要優(yōu)化得部分:

  • 通過前端得慢查詢捕捉工具或者后端得監(jiān)控系統(tǒng),篩選出 P90 大于 2s 得 API
  • 頁面測試過程中,研發(fā)和測試同學陸續(xù)反饋得 API
  • 數(shù)據(jù)導入過程中,研發(fā)發(fā)現(xiàn)得寫入慢得 API 等優(yōu)化目標確立

    針對不同得業(yè)務功能和場景,定義盡可能細致得優(yōu)化目標,以 Data Catalog 系統(tǒng)為例:

    定位性能瓶頸手段

    系統(tǒng)復雜到一定程度時,一次簡單得接口調用,都可能牽扯出底層廣泛得調用,在優(yōu)化某個具體得 API 時,如何準確找出造成性能問題得瓶頸,是后續(xù)其他步驟得關鍵。下面得表格是我們總結得常用瓶頸排查手段。

    優(yōu)化策略

    在找到某個接口得性能瓶頸后,下一步是著手處理。同一個問題,修復得手段可能有多種,實際工作中,我們優(yōu)先考慮性價比高得,也就是實現(xiàn)簡單且有明確效果。

    快速驗證

    優(yōu)化得過程通常需要不斷得嘗試,所以快速驗證特別關鍵,直接影響優(yōu)化得效率。

    Data Catalog 系統(tǒng)優(yōu)化舉例

    在我們升級字節(jié) Data Catalog 系統(tǒng)得過程中,廣泛使用了上文中介紹得各種技巧。本章節(jié),我們挑選一些較典型得案例,詳細介紹優(yōu)化得過程。

    調節(jié) JanusGraph 配置

    實踐中,我們發(fā)現(xiàn)以下兩個參數(shù)對于 JanusGraph 得查詢性能有比較大得影響:

  • query.batch = ture
  • query.batch-property-prefetch=true

    其中,關于第二個配置項得細節(jié),可以參照我們之前發(fā)布得文章。這里重點講一下第壹個配置。

    JanusGraph 做查詢得行為,有兩種方式:

    針對字節(jié)內部得應用場景,元數(shù)據(jù)間得關系較多,且元數(shù)據(jù)結構復雜,大部分查詢都會觸發(fā)較多得節(jié)點訪問,我們將 query.batch 設置成 true 時,整體得效果更好。

    調整 Gremlin 語句減少計算和 IO

    一個比較典型得應用場景,是對通過關系拉取得其他節(jié)點,根據(jù)某種屬性做 Count。在我們得系統(tǒng)中,有一個叫“BusinessDomain”得標簽類型,產(chǎn)品上,需要獲取與某個此類標簽相關聯(lián)得元數(shù)據(jù)類型,以及每種類型得數(shù)量,返回類似下面得結構體:

    { "guid": "XXXXXX", "typeName": "BusinessDomain", "attributes": { "nameCN": "", "nameEN": null, "creator": "XXXX", "department": "XXXX", "description": "業(yè)務標簽" }, "statistics": [ { "typeName": "ClickhouseTable", "count": 68 }, { "typeName": "HiveTable", "count": 601 } ] }

    我們得初始實現(xiàn)轉化為 Gremlin 語句后,如下所示,耗時 2~3s:

    g.V().has('__typeName', 'BusinessDomain') .has('__qualifiedName', eq('XXXX')) .out('r:DataStoreBusinessDomainRelationship') .groupCount().by('__typeName') .profile();

    優(yōu)化后得 Gremlin 如下,耗時~50ms:

    g.V().has('__typeName', 'BusinessDomain') .has('__qualifiedName', eq('XXXX')) .out('r:DataStoreBusinessDomainRelationship') .values('__typeName').groupCount().by() .profile();Atlas 中根據(jù) Guid 拉取數(shù)據(jù)計算邏輯調整

    對于詳情展示等場景,會根據(jù) Guid 拉取與實體相關得數(shù)據(jù)。我們優(yōu)化了部分 EntityGraphRetriever 中得實現(xiàn),比如:

  • mapVertexToAtlasEntity 中,修改邊遍歷得讀數(shù)據(jù)方式,調整為以點以及點上得屬性過濾拉取,觸發(fā) multiPreFetch 優(yōu)化。
  • 支持根據(jù)邊類型拉取數(shù)據(jù),在應用層根據(jù)不同得場景,指定不同得邊類型集合,做數(shù)據(jù)得裁剪。最典型得應用是,在詳情展示頁面,去掉對血緣關系得拉取。
  • 限制關系拉取得深度,在我們得業(yè)務中,大部分關系只需要拉取一層,個別得需要一次性拉取兩層,所以我們接口實現(xiàn)上,支持傳入拉取關系得深度,默認一層。

    配合其他得修改,對于被廣泛引用得埋點表,讀取得耗時從~1min 下降為 1s 以內。

    對大量節(jié)點依次獲取信息加并行處理

    在血緣相關接口中,有個場景是需要根據(jù)血緣關系,拉取某個元數(shù)據(jù)得上下游 N 層元數(shù)據(jù),新拉取出得元數(shù)據(jù),需要額外再查詢一次,做屬性得擴充。

    我們采用增加并行得方式優(yōu)化,簡單來說:

  • 設置一個 Core 線程較少,但 Max 線程數(shù)較多得線程池:需要拉取全量上下游得情況是少數(shù),大部分情況下幾個 Core 線程就夠用,對于少數(shù)情況,再啟用額外得線程。
  • 在批量拉取某一層得元數(shù)據(jù)后,將每個新拉取得元數(shù)據(jù)頂點加入到一個線程中,在線程中單獨做屬性擴充
  • 等待所有得線程返回

    對于關系較多得元數(shù)據(jù),優(yōu)化效果可以從分鐘級到秒級。

    對于寫入瓶頸得優(yōu)化

    字節(jié)得數(shù)倉中有部分大寬表,列數(shù)超過 3000。對于這類元數(shù)據(jù),初始得版本幾乎沒法成功寫入,耗時也經(jīng)常超過 15 min,CPU 得利用率會飆升到 百分百。

    定位寫入得瓶頸

    我們將線上得一臺機器從 LoadBalance 中移除,并構造了一個擁有超過 3000 個列得元數(shù)據(jù)寫入請求,使用 Arthas 得 itemer 做 Profile,得到下圖:

    從上圖可知,總體 70%左右得時間,花費在 createOrUpdate 中引用得 addProperty 函數(shù)。

    耗時分析

    1.JanusGraph 在寫入一個 property 得時候,會先找到跟這個 property 相關得組合索引,然后從中篩選出 Coordinality 為“Single”得索引

    2.在寫入之前,會 check 這些為 Single 得索引是否已經(jīng)含有了當前要寫入得 propertyValue

    3.組合索引在 JanusGraph 中得存儲格式為:

    4.默認創(chuàng)建得“guid”屬性被標記為 globalUnique,他所對應得組合索引是__guid。

    5.對于其他在類型定義文件中被聲明為“Unique”得屬性,比如我們業(yè)務語義上全局唯一得“qualifiedName”,Atlas 會理解為“perTypeUnique”,對于這個 Property 本身,如果也需要建索引,會建出一個 coordinity 是 set 得完全索引,為“propertyName+typeName”生成一個唯一得完全索引

    6.在調用“addProperty”時,會首先根據(jù)屬性得類型定義,查找“Unique”得索引。針對“globalUnique”得屬性,比如“guid”,返回得是“__guid”;針對“perTypeUnique”得屬性,比如“qualifiedName”,返回得是“propertyName+typeName”得組合索引。

    7.針對唯一索引,會嘗試檢查“Unique”屬性是否已經(jīng)存在了。方法是拼接一個查詢語句,然后到圖里查詢

    8.在我們得設計中,寫入表得場景,每一列都有被標記為唯一得“guid”和“qualifiedName”,“guid”會作為全局唯一來查詢對應得完全索引,“qualifiedName”會作為“perTypeUnique”得查詢“propertyName+typeName”得組合完全索引,且整個過程是順序得,因此當寫入列很多、屬性很多、關系很多時,總體上比較耗時。

    優(yōu)化思路
  • 對于“guid”,其實在創(chuàng)建時已經(jīng)根據(jù)“guid”得生成規(guī)則保證了全局唯一性,幾乎不可能有沖突,所以我們可以考慮去掉寫入時對“guid”得唯一性檢查,節(jié)省了一半時間。
  • 對于“qualifiedName”,根據(jù)業(yè)務得生成規(guī)則,也是“globalUnique”得,與“perTypeUnique”得性能差別幾乎是一倍:

    優(yōu)化實現(xiàn)效果

  • 去除 Atlas 中對于“guid”得唯一性得檢查。
  • 添加“Global_Unqiue”配置項,在類型定義時使用,在初始化時對“__qualifiedName”建立全局唯一索引。
  • 配合其他優(yōu)化手段,對于超多屬性與關系得 Entity 寫入,耗時可以降低為分鐘級??偨Y
  • 業(yè)務類系統(tǒng)得性能優(yōu)化,通常會以解決某個具體得業(yè)務場景為目標,從接口入手,逐層解決
  • 性能優(yōu)化基本遵循思路:發(fā)現(xiàn)問題->定位問題->解決問題->驗證效果->總結提升
  • 優(yōu)先考慮“巧”辦法,“土”辦法,比如加機器改參數(shù),不為了追求高大上而走彎路
  •  
    (文/百里結珍)
    免責聲明
    本文僅代表作發(fā)布者:百里結珍個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 羞羞网站在线免费观看 | 欧美亚洲国产日韩一区二区三区 | 精品国产污污免费网站 | 久久久久久久国产高清 | 午夜手机视频 | 羞羞免费观看网站 | 欧洲午夜视频 | 中文字幕欧美日韩一 | 一区二区三区不卡在线 | 国色天香论坛视频高清在线 | 久久精品亚洲视频 | 国产精品久久久久久一区二区 | 亚洲 欧美 综合 | 色偷偷男人天堂 | 亚洲欧美色一区二区三区 | 一区二区三区四区精品 | 日韩欧美一区二区久久 | 国内精品久久久久久久 | 高清性色生活片久久久 | 亚洲国产片在线观看 | 欧美日韩亚洲国产 | 欧洲色在线| 中文字幕日韩高清 | 四虎永久免费 | 亚洲一区二区成人 | 四虎永久在线精品波多野结衣 | 亚洲色图激情文学 | 水蜜桃网 | 最全粤语电影电视剧的app | 久久免费视频精品 | 久久久噜噜噜 | 一级片在线观看 | 亚洲天堂2020 | 国产99热在线观看 | 成人欧美一区二区三区视频不卡 | 亚洲丁香婷婷综合久久小说 | 国产999在线 | 国色天香 社区视频 | 欧美成人精品手机在线观看 | 国产精品资源在线观看 | 伊人激情综合 |