参考链接:
数仓分层是业界公认的最佳实践:
ods、cdm(dwd、dim、dws)、ads
事实表。什么是事实,基本是数值
事实
指的是业务过程中可度量、可量化、可分析的数值型指标或度量值(Metrics/Measures)。
事实分类:
维度建模(如星型模型、雪花模型)中,事实被集中存储在事实表中。事实表通常位于模型的中心,周围环绕着提供上下文的维度表。
事实表的结构:
product_id
、customer_id
。sales_amount
, quantity_sold
, page_views
。事实表分类:
如何建⽴⼀张事实表
维度表
如何建⽴⼀张维度表
缓慢变化维(SCD)
层级维度表如类目、组织架构维度处理。一般是打平,如类目有固定层级 3 级或 4 级,组织架构一般不会有层级限制,可无限创建,但实际应用中也就 5 层左右。
维度建模方式:星型模型、雪花模型、星座模型
在数据仓库的维度建模中,星型模型 和 雪花模型 是两种最核心的模式设计。它们都基于事实表 + 维度表
的架构,但在维度表的规范化程度上存在关键区别:
非规范化
的,维度表通常是宽表,包含丰富的层次信息,且不进行拆分
规范化
的,维度表不是宽表,而是根据范式原则被拆分成多个相关的表,形成层级结构
如何选择?推荐采用星型模型:数仓需满足分析需求
,查询性能
和易用性
比存储资源和数据一致性更重要。
不同分层建模:
cube、group by sets、rollup
数据仓库的开发是一个系统化、分阶段的工程过程,旨在将分散、异构的源数据转化为结构化、高质量、可分析的决策支持信息。一个典型的开发流程遵循分层架构和生命周期管理原则,主要包含几个关键阶段:
描述
原因。hdfs 的设计是一次写入,多次读取
的大文件
处理。任何违背这一原则的、产生大量小规模、零散写入的操作,都极有可能导致小文件问题
set mapreduce.job.reduces=1000
),即使输入是大文件,输出也会被分成 1000 个文件,导致输出文件变小。repartition()
或 coalesce()
操作分区数设置过大,saveAsTextFile()
等操作会为每个分区生成一个输出文件。例如:df.repartition(1000).write.parquet("path")
会生成最多 1000 个文件,如果数据量只有 1GB,平均每个文件仅 1MB影响
内存
中。每个文件、目录和块在 namenode 中都对应一个对象,占有⼀定的字节记录元数据,小文件过多代表同等的存储资源下会产生更多的 namenode 元数据。fsimage
,editlog
存储元数据,元数据过多会导致 fsimage
过大,备份和恢复耗时长。解决办法。
原理
具体方法
监控与告警。建立对 hdfs 文件数量、namenode 内存使用率的监控,及时发现小文件堆积问题
计算引擎。调整配置,优化数据写入逻辑(增加 buffer 和 compaction 小文件变大文件)
减少任务 reduce 数量。set mapred.reduce.tasks = 10
增加⼀层任务重写分区数据,合并⼩⽂件
通过调整参数解决⼩⽂件
set hive.merge.mapfiles=true
,在map only任务中合并⼩⽂件
set hive.merge.mapredfiles=true
,在reduce结束后启动⼀个map only任务
合并⼩⽂件,通常配合 hive.merge.smallfiles.avgsize = 16000000
(16M) 参
数⼀起使⽤
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
。在map输⼊端进⾏⼩⽂件合并调整数据存储格式。优先选择支持块压缩和列式存储的格式,如 Parquet
、 ORC
。这些格式本身可以将多个记录高效地存储在一个文件中,并且支持谓词下推,减少 I/O。
hdfs 本身
参考:
参考: