数据治理-存储资源治理

存储资源治理背景

对于存储资源治理来说,由于早期数仓在存储资源充足情况下,未考虑到后续扩容和存储格式问题导致后续存储资源紧张,从而需要整体治理。

语兴作为数仓开发,在之前工作经历中也经常收到存储水位线告警信息,但遇到这类问题很多数仓同学可能想到的都是加资源,这个想法其实在数仓扩张期适用(全面做中间层、应用层),但到业务缓慢变化,基建完善后回过头来看需要做大面积降本。

存储资源治理思路

梳理出长期未被使用/引用模型,及生命周期不符合当前标准数据模型,未分区,空表,文件数,文件格式,长期全量存储等(通过元数据模型或平台捞出)。

优化方案,可以从这几点优先入手。用最少的人力成本和时间成本,达到显著的优化。下线无用数据表节省存储->存储格式及压缩格式配置->分区生命周期优化->根据业务情景实现节省存储即数据模型优化。

存储资源问题识别及治理

1.获取存储资源元数据及数据血缘元数据

通过采集的元数据信息,进行元数据表梳理及建设(元数据来源可以通过开源工具、数据平台自带元数据、工具二次开发等方式进行获取,这里展示是数据平台进行元数据采集)

存储计算资源治理需要存储资源元数据、数据血缘即可分析存储现状,元数据表DDL如下:

--数据血缘元数据DDL
CREATE TABLE `yx_dwd`.`dwd_meta_table_lineage_detail_df`(
`join_name` string COMMENT '关联用表名', 
`table_layer` string COMMENT '表分层', 
`relation_table_id` string COMMENT '血缘表id', 
`relation_type` bigint COMMENT '血缘类型:-1-上游 1-下游', 
`relation_cata_log` string COMMENT '血缘集群or数据源', 
`relation_db_name` string COMMENT '血缘库名', 
`relation_table_name` string COMMENT '血缘表名', 
`relation_layer` string COMMENT '血缘分层', 
`lineage_update_time` string COMMENT '血缘同步时间', 
`relation_join_name` string COMMENT '血缘表关联用表名,库名.表名')

CREATE TABLE `yx_dwd`.`dwd_meta_table_detail_df`(
  `cata_log` string COMMENT '集群or数据源', 
  `db_name` string COMMENT '库名', 
  `table_name` string COMMENT '表名', 
  `layer` string COMMENT '分层', 
  `creator` string COMMENT '表创建人id', 
  `creator_name` string COMMENT '表创建人姓名', 
  `comments` string COMMENT '表描述', 
  `tbl_type` string COMMENT '内部/外部/视图', 
  `tbl_loc` string COMMENT '表的存储位置', 
  `file_total_fromfile` bigint COMMENT '文件总数: 计算方法为根据表所在的路径的文件信息统计得到', 
  `size_total_fromfile` double COMMENT '存储量:这里是逻辑存储量,未考虑副本,单位为MB;计算方法为根据表所在的路径的文件信息统计得到', 
  `tbl_create_time` string COMMENT '创建时间', 
  `tbl_creator` string COMMENT '文件的创建人', 
  `partition_tbl` string COMMENT '是否是分区表', 
  `tbl_ref_num` bigint COMMENT 'job,query引用的job个数(注意开发模式和任务模式的job算两个)', 
  `tbl_visit_num` bigint COMMENT 'job,query的访问次数', 
  `refer_count` bigint COMMENT '引用次数(元数据中心)', 
  `read_count` bigint COMMENT '读取次数(元数据中心)', 
  `storage_type` string COMMENT '存储格式', 
  `last_modified_time` bigint COMMENT '变更时间', 
  `lifecycle` string COMMENT '表生命周期', 
  `partition_lifecycle` string COMMENT '分区生命周期', 
  `changetimes` bigint COMMENT '修改次数', 
  `file_average_size` double COMMENT '文件平均大小', 
  `tbl_owner_email` string COMMENT '表owner email', 
  `reference_tbl_num` bigint COMMENT '被表引用次数', 
  `has_lifecycle` string COMMENT '是否已设置生命周期', 
  `par_num` bigint COMMENT '分区数量', 
  `little_file_count` bigint COMMENT '小文件数量', 
  `little_file_par_num` bigint COMMENT '小文件分区数量', 
  `lifecycle_whitelist` string COMMENT '是否加入生命周期永久保存'
  )

2.无用/临时数据表下线评估临时表治理

临时表治理

对于临时表治理可以使用正则及rlike从数据表元数据匹配开头为tmp、temp表,同时集合数据血缘元数据进行扫描找到上下游独立节点表进行下线,切记不能对tmp表直接下线,有的tmp表下游仍有依赖(一般都是大家在开发指标时方便用于临时存放)。

select
from `yx_dwd`.`dwd_meta_table_detail_df`
where ds='2024-06-21'
and table_name rlike 'tmp_'
--这里只是一个案例,对于tmp命名位置需要去like匹配,也可以正则匹配

无用表治理

这里我们能看到最后ads是具备数据血缘的,有血缘并不代表有效,而是需要看数据表被使用情况,以及被数据看板使用情况,如看板长期未使用数据表长期未访问,可与业务确认并下线,其次还有一些非临时表的数据表简称空表,可能命名没问题,但无数据存放,也比较好筛选。

可以通过存储资源元数据表可定位最近30天/60天数据表被检索次数(数据地图中搜索次数)、引用次数(被下游使用)、读取次数(查询表次数),这里检索次数获取比较难,可以先用引用次数、读取次数为标准,从而评估数据表是否

3.表存储格式+压缩治理

对压缩格式和存储格式重新定规范

存储选择orc 或parquet,如果平时用spark3跑任务更建议用parquet,使用Parquet作为存储格式时,Spark SQL可以更有效地进行数据的调度和执行。例如,Spark SQL可以优化执行路径,减少stage的执行消耗,并降低CPU的消耗,还可以利用下推过滤器等技术来进一步减少磁盘I/O和内存的占用。

压缩格式选择snappy or gzip,snappy 适用于需要快速压缩和解压的场景,在处理数据时消耗的CPU资源相对较少,gzip偏向于高压缩率,压缩速度慢消耗大,适用于存储归档或传输大量数据以节省存储空间或带宽。

这里更推荐parquet+snappy,因此对于早期text不规范任务,以及大量小文件任务都可以做集体整治,可通过动态分区刷数办法完成表迁移及小文件处理。

这里重点需要识别text表数量,并对整体表存储和压缩格式进行切换,但大体看来切换部分还是较少(目前2024基本都orc or parquet了吧)

4.分区生命周期治理

通过数据表分区生命周期字段去查看,1要确认表分区是否永久,2要确认表分区范围是否合理,因此需要结合当前现状重新指标表分区(分区标准只是概念,通用数据表可参考,但对于di表及部分ads应用表需要因地制宜)

分区生命周期范围:

层级

生命周期

ODS

1年 or 永久

DIM

5年(非用户维)

DWD

3年,部分5

DWM

3年,部分5

DWS层

5年

ADS层

5年

网易easy data 数据地图-生命周期设置

通过制定的数据表标准对原有数据表分区进行整改,但整改之前需要跟表负责人以及下游业务确认,不可直接放弃历史分区(即使是全量分区),可优先梳理出问题分区数据表再进行排期整改。

5.分区优化及增全量修改

对于分区优化,如果只有日期分区可以直接进行分区裁剪如第四点讲到的内容,这里特指二级分区,二级分区例如我们之前课程中讲到的日期+场景、日期+规则,由于二级分区+日期不断增多导致数据查询过慢,分区量暴涨,导致数据模型极为难用,甚至部分表分区超过3w,对于这种情况1.直接拆表按照二级分区内容再做归类。

举例按照之前金融风险名单规则来看,目前二级分区包括最大预期天数、失信人、坏账、多头坏账等等规则,目前规则数量达到500+,所以每天生成分区则是500个,对于这种情况可以按照规则进行拆解,例如金融风险名单-金融负面、金融风险名单-司法负面、金融风险名单-企业负面等等,拆解规则提升模型易用能力,同时也降低了耦合(例如某个规则无法产出)。

增全量分区,可以从订单或其他视角来看,如之前存储采用全量分区存放,虽然提升便捷但分区不能这么支撑,所以需要全改增,对于历史完成的订单我们放到2099-01-01分区形成关单,对于t-1分区则通过create_time及update_time获取t-1对应新增或修改数据存放。

存储资源治理评估

这里更多是对于数仓内部价值,对管理者或整体部门价值则是减少部门费用总支出

(1)下线各层无用/临时数据表总计xxx个,释放存储资源xxxxT;

(2)使用Parquet格式+Snappy压缩,提升压缩比,存储资源由原来xxxxT降低至xxxxT

(3)统一生命周期节省不必要的存储资源,对于临时表采用7天表存储生命周期,对于每一分层、业务进行统一裁剪,存储资源由原来xxxxT降低至xxxxT

(4)根据不同业务场景,通过表改造,增全量方式存储存储资源由原来xxxxT降低至xxxxT

(5)整体治理后为部门减少1/3总费用,由原来的xxxx万元降低至xxxx万元

存储资源维护

那么存储资源的思路在上文已经介绍给每位读者。但不可能是手动的方式定期治理,费时费力,所以需要用可视化的方式,对存储信息定期观察,可以通过数据平台,如条件不支持报表展示也可以。一般来说通过扫描元数据进行监控,同时配置自己的规则,建设存储标准分,即可形成标准。

#数据人offer决赛圈怎么选##数据人的面试交流地##数据分析##数据开发工程师##java#
全部评论
网易的数据治理平台吗
点赞 回复 分享
发布于 03-12 17:43 四川

相关推荐

虾皮(面试专场,一天速通)⌚️投递时间:2.20👋笔试:2.20(单选、多选、原生js写todo-list)🤏一面:2.22✌️二面:2.22😉oc:2.21百度(两周)⌚️投递时间:2.14👋一面:2.19🤏二面:2.24✌️三面:2.27😉oc:2.27(当晚hr电话口头offer)字节(一周)⌚️投递时间:2.17👋一面:2.24🤏二面:2.27✌️三面:2.28等待hr面......面经不完整记录(仅记录记得住 & 非实习 & 非项目相关的问题):一、虾皮:一面:* 手撕:lodash_get方法(考到数组循环几种方式,各种错误边界判断考虑)* 小程序心跳机制(实现思路) -> webSocket -> 为什么要用webSocket,而且用户等待时间过久,不再发送心跳,webSocket断掉了,用户不就拿不到新的数据了吗 -> 使用SSE服务端推送,解决了用户手动刷新消息列表的问题、又解决了用户停留时间过长,webSocket断掉的问题* 有看什么书吗 -> 没有,为什么?太枯燥,平时看博客、写博客 -> 看下博客 -> 最近一次什么时候写的 -> 为什么现在不写(阅读量低、不知道写什么)-> 博客内容都是自己写的吗 -> 一些有参考,一些是自己开发过程中遇到的就是自己写的 -> 要坚持写博客(写博客被面试官加分)* 和面试官聊得不错,有说有笑二面:1. 实习过程中技术上的提升2. js和java的区别(解释性语言和编译性语言的区别)继承和多态3. 最近学什么东西4. 怎么准备面试5. 有没有准备软件工程、计算机组成原理方面的面试 -> 无6. 进程和线程7. 状态码8. 敲下一个路径,浏览器的解析过程9. 写项目的一些收获(查看提交记录),对着仓库讲10. 够不够拼、够不够努力,主要是react,你怎么考虑11. 上一段实习的工作强度、工作时间反问:1. 团队氛围 -> 不PUA2. 最近是不是在急招,流程推这么快ps:一面面试官不错,对着我的实习业务就是一阵拷打(拷打到回答不上来)二面上压力(全程黑脸)不分暑期跟日常,表现好转正(经典话术)============================================================二、百度:一面* 算法:有效括号匹配、全排列(重复元素没去重,面试官说算我过)-> 都是leetcode原题* 八股相关二面:* 算法:找出第一个不重复的字符的位置,如'abcabcde',第一个不重复的字符'd',返回它的位置* git相关,场景:主分支代码推上去后,跑去dev开发;此时主分支需要hotfix,怎么解决 -> git stash -> git commit 和git stash都是本地存,有什么区别,为什么不用commit而是stash -> commit和stash的区别(不熟悉)* CDN相关:有CDN和没CDN的流量路径是怎么样的,有什么区别 -> 有了CDN一定比没有CDN更快吗(不一定,如果没缓存,还是得去根域名服务器查找) -> 那假设现在有缓存呢?一定更快吗资源部署之后,访问的路径是怎么样的* 现在有个接口,项目多个地方使用,怎么避免不必要的多次调用 -> 全局store维护一个变量表示是否已经请求过,false则请求 -> 那判断的时机是什么?生命钩子判断 -> 但现在有n个页面就要有n份代码 -> 路由守卫来执行* 开放题:一段复杂的代码(体积较大,假设2M),现在有两种方案:1. 通过iframe引入;2. 通过npm独立发包后引入,你会用哪种方案,为什么三面:* 聊学习路线、聊学习规划,无手撕* 问有没有学四大件 -> 学校主java,强行打断施法* 聊业务,让推进度 -> 结束没多久hr打电话给口头ps:百度三轮面试官面试感受无敌,主Vue,而且会用Node做中间层(个人很感兴趣其实,且Vue相对上手快些),组内不分暑期跟日常===========================================================三、字节一面:* 写一个mergePromise、异常处理* Vue的双向绑定原理、项目中挑一个最深的点讲一讲* http常见状态码、三次握手过程* 大文件切片上传、断点续传、秒传实现思路* 了解Node吗?用过Node吗?(说曾经用过Express写增删改查)熟悉数据库吗(No)手写:*. mergePromise*. 合并数组(LeetCode原题)*. 获取链表倒数第k个节点*. 用Vue写一个todo-list 二面(无自我介绍,直接开始表演):* vue封装一个menu组件(一二级菜单 -> 如果菜单层级嵌套不止一层,怎么处理)* 给一个url数组,限制最大请求数(理发师问题)-> 说写得有点点小瑕疵,后面看了一下,应该返回每个的执行结果,而不是只返回其中某个#牛客AI配图神器#* 性能优化 -> 资源压缩、懒加载、小文件合并大文件减少请求次数、组件缓存、base64、雪碧图、防抖节流....* 讲讲vue的diff算法 -> 双端对比,组件乱序部分使用最长递增子序列 -> 根据key维护哈希表,实现时间复杂度 O(n ^ 2) -> O(n)* 反问:前端角度,后端node较多,react较多,希望找的实习生能够转正让推面试流程三面:* 实习经历拷打,更多的是问为什么要这个(业务层面的思考)* offsetCanvas对比canvas好在哪* redo、undo撤消重做 -> 讲到命令模式* 一张雪碧图,里面的图片可能是不规则的(矩形、正方形、圆形、三角形)怎么去确认每张图形的位置* 说前两轮算法、手撕、项目都问得差不多,这轮无手撕,无项目拷打(暗喜)反问:* 部门介绍* offer情况,让帮忙推进度* 不足改进的地方:业务多问为什么,而不是一味的技术实现等待hr面中....=================================================================写在最后:1. 没有技术可言,全是运气这一点真的在这次求职过程中深深感受到了。就拿虾皮的面试专场来说,我是第一场早上开始的(应该是算早的那一批),每轮过后面试官就立马推入下一轮,我看牛客上一些牛友和我应聘同一个岗位,可能就是因为时间点的问题,流程比我稍稍慢一点2. 面试不是完美主义,有地方不足就靠其他地方拉平不足。同样是虾皮的面试,面试官对着我的实习、项目疯狂输出,说实话后面被问得哑口无言,但这时候脑子别乱......稳住就赢了3. 字节实在出乎意料。字节本不在我的计划之内,boss找到我之后犹豫了很久最终决定冲一把。目标其实是不要脏了面评,结果干到三面。字节三轮面试下来感觉还不错,没有传说中那么push,第一轮甚至还是女面试官4. 字节的手撕和算法是最多的,手撕部分似乎很喜欢考异步相关处理5. 字节主React,组内还会有Node,个人主Vue。希望能抗住压力。等待hr面中...不奢望转正,跟上进度、别职场霸凌我就行6. 其实这波求职中,美团才是我的大厂处女面,手撕获取路径参数的时候把 isNaN() 给忘了,没撕好至今快过去两周了,应该是挂了......听说美团培养制度无敌,可惜。不过也不是没收获,在反问环节问面试官我的不足时,讲到:“讲一些复杂的思路时可以不用事无巨细,感觉像是在背,而不是在聊”老实了,后面的面试中光速调整策略。所以说,没事多面,积攒经验7. 在我看来,大厂面试官似乎跟喜欢候选人对整体局面(包括项目整体、功能整体、业务整体)的掌握,再由讲到的一些点不断切入8. 还投了某东,综合测评做得我跟人格分裂一样三个褒义词非要我挑一个我最不符合的9. 腾子投了两周后通知面试,至今未开始,应该要推掉了,太鸡儿累了最最后,许愿字节hr面别挂,不然我真成🤡了#我的OC时间线##牛客创作赏金赛##前端##暑期##26暑期实习#
刷了100道题的傻狍子很有胆量:mergePromise和todoList是什么 完 又有得看了
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务