数据仓库-数仓优化小厂实践

news/2024/6/17 7:02:57 标签: 数据仓库

一、背景

        由于公司规模较小,大数据相关没有实现平台化,相关的架构都是原生的Apache组件,所以集群的维护和优化都需要人工的参与。根据自己的实践整理一些数仓相关的优化。

二、优化

        1、简易架构图

        2、ODS层优化

        2.1 分段式解析

        随着业务增长,数据量也不断增加,凌晨任务经常基线预警、破线,导致数据不能正常产出,影响运营人员分析数据。在不增加成本的情况尽可能的优化。

        经过团队研究,发现 t-1 的日志解析占用非常长的时间,且集群资源空闲时间点比较多。

        把日志的解析分成两段式,当天0点到22点数据可在22:15进行解析,22点到24点数据在00:15解析,大大节省了时间,还充分利用了集群的资源。有效的缓解了破线问题。

        2.2 小文件合并
    1.原因:a.读取的数据源文件本身就有大量的小文件
            b.动态分区插入数据,每个reduce产生的文件个数为动态分区的个数,产生文件个数=reduce个数*动态分区数
            c.reduce/Task个数较多(和文件数是一样的)
    
    2.影响:a.文件的数量决定了Mapreduce/Spark中Mapper/Task数量,小文件越多,Mapper/Task的任务越多,每个Mapper
              /task都会对应启动一个JVM/线程来运行,每个Task数据小,个数大,占用资源多,甚至这些任务初始化的时间
              可能比执行的时间还要多,影响性能,当然这个问题 可以通过CombinedInputFile和开启JVM重用来解决。
              
           b.文件存储在HDFS上,每个文件的元数据信息(位置、大小、分块信息)大约占150个字节,文件的元数据信息分别存储在
             内存和磁盘中。   
    
    3.解决方法:通过 DISTRIBUTE BY 控制文件的个数
    
            distribute by 1
            distribute by cast(rand()*10 as int)
            distribute by dt
            distribute by substr(udi,1,2)
        2.3 提高数据压缩比率

        1.问题描述 :使用 DISTRIBUTE BY INT(RAND()*300) 随机数的方式控制了文件的个数,但是使用的SNAPPY压缩,压缩比原则是十倍左右,目前只能达到两倍左右。

        原因:每个文件里面的数据随机,数据的相似性较小,压缩比上不去

        2.问题解决:DISTRIBUTE BY SUBSTR(udi,1,2) 使用文本字段进行文件数的控制,文件个数减少了,并且文件的大小也变小了,压缩比变大

        说明:udi前两个为(字母+数字),截取前两个组合来作为文件的个数(最多36*36)

        原理:将相似的数据放在同一个分区里,数据压缩比增大 

        2.4 分项目业务数据导入优化

        1.问题描述:由于项目数量比较多,并且会持续增加,项目之间的业务表相同,按照sqoop传统导数据的脚本,会编写很多冗余的脚本,费时费力,且增加新项目时,开发成本较高

        2.问题解决:将不同的数据库的配置信息(host、IP、账号、密码、脚本路径) 配置到mysql表中,编写相应的脚本,脚本根据给定的参数去读取相应的配置,进行对应项目的数据导入。

3、DWD层优化

        3.1 缩减分区

        1.问题描述:初始建立二级分区(项目+天),随着老项目的数据量增加,以及新项目上线数据量较少, 导致执行时造成数据倾斜,以及多级分区造成文件数以及分区数成倍增加,造成数据寻址时间过长。 执行时间较短,但是刷盘的时间过长,晚上流程的时间整体拖延。

        2.问题解决:将二级分区改为一级分区

        3.解决方法:a.建立同样的临时表

                        b.将历史数据mv导入到临时表中,此时进行核对数据量

                        c.通过命令修复临时表的分区

                        d.将旧表删除,建立新的分区表

                        e.将临时表的数据导入到新的表中,核对数据


http://www.niftyadmin.cn/n/5292508.html

相关文章

Qt编写的exe程序上添加程序信息

1、qtcreator编写 在pro文件中添加如下信息 # 版本信息 VERSION 4.0.2.666# 图标 RC_ICONS Images/MyApp.ico# 公司名称 QMAKE_TARGET_COMPANY "Digia"# 产品名称 QMAKE_TARGET_PRODUCT "Qt Creator"# 文件说明 QMAKE_TARGET_DESCRIPTION "Qt …

析构和友元函数

1. 类的析构函数 析构函数的作用,用于释放该类所占用的资源(或者说释放对象)在类的对象使用完时(当类的对象超出了作用域),会自动调用析构函数;如果是在堆区实例化的对象,那么当手动…

【第十二课】KMP算法(acwing-831 / c++代码 / 思路 / 视频+博客讲解推荐)

目录 暴力做法 代码如下 KMP算法 不同的next求法-----视频讲解/博客推荐 视频推荐 博客推荐 课本上的方法- prefix的方法- 求next数组思路---next数组存放前缀表的方式 s和p匹配思路 代码如下 暴力做法 遍历s主串中每一个元素,如果该元素等于模板串p中…

2013年第二届数学建模国际赛小美赛A题数学与经济灾难解题全过程文档及程序

2013年第二届数学建模国际赛小美赛 A题 数学与经济灾难 原题再现: 2008年的市场崩盘使世界陷入经济衰退,目前世界经济仍处于低迷状态,其原因是多方面的。其中之一是数学。   当然,并非只有金融界依赖于并非总是可靠的数学模型…

Visual Studio Code安装下载及安装自用版

Visual Studio Code安装下载及安装自用版 vscode 我愿称之为最强,赶紧下载吧,用起来再说。微软牛逼。 安装过程也非常简单。 一、下载 Visual Studio Code下载地址 1.选择要下载的客户端的版本,直接下载稳定版的 注意: 下载后&…

kafka 有几种数据保留的策略?

kafka 有几种数据保留的策略? 在 Apache Kafka 中,有几种数据保留策略用于定义消息保存的时长和数据保留的规则。这些策略主要影响 Kafka 中的 Topic。 以下是 Kafka 中常见的数据保留策略: 保留时间策略(retention.ms&#xff…

uniapp 目录结构

uniapp 项目常用的目录结构和每个文件的作用。 uniapp 目录结构 components // 组件目录 api // 封装接口目录 node_modules // 环境依赖 pages // 页面文件目录index …

力扣:763. 划分字母区间(贪心,哈希)

题目: 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度…