大数据开发运维都重要的知识点
///sql调优
一、从数仓设计层面
1、按照场景数仓分层ODS-DWD-DWS-ADS,将复杂计算下沉到低层级
2、适当采用星型模型,大表,减少join,用空间换时间
二、表设计层面
1、建表时尽量分区(按天/小时,一般一级二级分区),分桶(高频关联字段)
2、创建索引(where/join/order by/group by)等能显著减少查询范围的条件
3、物化视图(对高频查询做数据预处理),一般做增量刷新
4、数据存储形式(高频更新的表用ORC/极少更新的表用parquet压缩率更高)
三、sql语句
1、explain执行计划 看type(扫描类型system最优、all最差) key(实际用到的索引非null或者null) row(扫描多少行)
2、精准条件筛选,避免过多表的join
3、避免慢sql(数据倾斜),添加随机数rand函数打散
4、适当使用窗口函数,减少数据扫描次数,减少冗余关联
///数据倾斜
1、在查询场景中
个别分区数据量远超其他分区,导致该分区所在节点计算I/O压力过大,导致整体查询时间过长,解决方法为数据重分布,将该分区数据随即散落到多个节点
聚合/关联字段空值过多,空值被分配到同一个节点,导致出现热点key,解决方法为给空值key添加随即前缀random(10),生成十个不同的空值key,打散到不同节点,若业务允许过滤空值后再聚合
2、在表设计层面预防
选择适当字段(均匀分布的)做分区字段例如按天分区或者小时,或者再进行细粒度按业务多级分区
表的主键或者关联字段值不能为空,这在根本上解决空值导致热点key出现数据倾斜,如果业务必须保留空值,可将空值映射为-1或者其他特殊值
3、关联字段类型不一致(string和int),会导致隐式转换,某类数据被错误分配到同一节点
4、大表关联小表
5、高频热点key
///数据建模(广义概念)
首先明确两个概念
OLTP:面向业务操作,管 “数据的增删改查”,追求快写快读;
OLAP:面向数据分析,管 “数据的统计聚合”,追求复杂查询高效。
数据建模中ER模型和维度模型是两大核心,ER模型是范式化建模,适配OLTP业务系统,追求数据一致性、低冗余;维度模型是反范式化建模,专为OLAP分析场景设计,牺牲少量冗余提升查询效率,所以数仓生产环境主流用维度模型。
维度模型主要分星型和雪花,星型是单张事实表直接关联多张维度表,维度表不做拆分,优点是模型简单、查询速度快,是生产最常用的;雪花模型是在星型基础上,对维度表做范式化拆分形成子维度表,虽降低了数据冗余,但增加了联表层级,查询性能差,生产中一般很少纯用,仅局部场景适配。
///olap oltp
OLTP是业务系统,面向日常业务操作,以少量增删改查为主,核心追求高并发、低延迟;
OLAP做数据统计分析,处理批量汇总或历史全量数据,适配数仓,核心追求复杂查询、多维度聚合高效。
总结:
日常业务界面系统(如交易、办公、业务操作平台)核心是OLTP,处理高频的单条/少量事务操作;大数据分析场景(如数仓、BI报表、数据挖掘)核心是OLAP,处理海量数据的批量汇总与多维度分析。
常用两种建模方法论
1、 维度模型(专为OLAP/数据分析设计)
核心组件:事实表、维度表
典型结构:星型模型、雪花模型
概念详解:
事实表:存储具体值,必须包含维度表的主键(特征是数据量巨大)
维度表:存储业务描述信息以及维度主键(特征是更新频率低,数据量小)
星型模型:一张事实表,多张维度表
雪花模型:在星型模型基础上,维度表有子表(拆分成子表的原因是规范化拆分,消除冗余) //例如国家子表,省子表,市子表
2、 ER模型(实体关系模型,专为OLTP/业务系统设计)
其他模型(如数据 Vault 模型)
核心目标:抽象数据结构,实现清晰、复用、高效查询
总结:一般在生产环境中优先星型模型
///数仓分层
ODS层:存储原始数据
DIM层:存储维度表数据,供DWD层复用
DWD层:数据清洗,关联维度主键
DWS层:按照大业务场景,数据轻量汇总,生成宽表,减少ADS层数据重复处理
ADS层:面向具体业务,高度聚合数据,数据直接用于展示在前台
///jvm调优
jvm堆内存里老年代和新生代是内存区域,默认占比是2:1,也就是说当一个java程序分配30G内存时,老年代占了20G,新生代占了10G,当用jstat-gccause pid查看程序GC状态时,当老年代内存使用率长期处于90以上时说明老年代长期存活的对象导致内存紧张,最终由于老年代内存使用率长期百分之90以上以及新生代频繁触发YOUNG GC(默认15次以上还没有回收时)向老年代晋升对象会导致FGC,那么在FGC后,还是没有内存可用,新生代内存占用率也持续升高,导致无法创建新对象才会报错OOM一般情况下一次full gc后还不能创建新对象的话则直接抛出oom异常
那么有两个问题
1 新生代在晋升为老年代的触发条件
2为何full gc后还是没有内存空间创建新对象
第一个问题触发条件有
1新生代默认15次young gc后还存活
2已经young gc到survivor区后该区空间不足
3大对象(默认无限制大小,需自行设置)直接进入老年代
第二个问题
1 内存泄漏
2 堆内存不足
3大对象持续创建
更多推荐
所有评论(0)