文章目录
- 面试题整理
- 数据仓库是如何分层的?每一层的作用是什么?为什么要这么分层?
- 什么是数据倾斜?如何处理大数据中的数据倾斜?
- 如何区分冷热数据的分离?如何处理冷数据?
面试题整理
数据仓库是如何分层的?每一层的作用是什么?为什么要这么分层?
为什么要分层:
1 复杂问题简单化,容易定位问题
2 减少重复开发,利用中间层数据,大大减少重复计算,增加数据复用性。
3 隔离原始数据,将统计数据和原始数据隔离开。
如何分层:
1 ODS (operational data store)层:存放原始数据。
2 DWD (data warehouse detail)层: 数据清理(去空,脏数据,不合理数据),维度退化,脱敏等。
3 DWS (data warehouse summary)层:以Dwd 为基础,按天进行轻度汇总。
4 DWT 层:以 DWS 层为基础,按照主题(维度) 进行汇总。
5 ADS(application data store) 层:以 DWT 和 DWS 为基础,为报表提供数据。
什么是数据倾斜?如何处理大数据中的数据倾斜?
正常的数据分布理论上都是倾斜的,简单来说就是 数据key 的分化严重不均,造成了一部分数据很多,一部分的数据很少的局面。
表现:
- hive 算数据的时候 reduce 阶段卡在99.99%
- 用 spark Streaming 做实时算法的时候,一直会出现 executor OOM 的错误。
- Flink 使用window group by distinct 等聚合函数的时候频繁出现反压,消费速度很慢,调大资源也无济于事。
数据倾斜的原理和解决方案
数据运算的时候会涉及到 count distinct group by join 等操作,都会触发shuffle 动作,一旦触发,所有相同的key 值就会拉到一个或者是几个节点,发生单点问题。
一个简单的场景就是,在订单中,北京和上海两个地区的订单数量比其他的地方要高出好几个数量级,那么进行聚合的时候,就会出现数据热点的问题。
解决数据倾斜的几个思路。
- 业务上:避免热点key 的设计或者是打散热点key,例如可以把北京和上海分成地区,然后单独汇总。
- 技术上:出现热点的时候,需要调整方案,避免直接进行聚合,可以借助框架本身的能力,例如进行 mapside-join
- 参数上 hadoop spark 还是 flink 都提供了大量的参数可以调整。
如何区分冷热数据的分离?如何处理冷数据?
根据存储数据对当前业务的重要性以及访问频率来区分级别,热数据需要经常被访问接近CPU,冷数据位于磁盘或远离数据中心的存储介质上。一般来说经常访问的数据需要响应比较快的设备来存储。冷数据可以存储在成本比较低的设备上。
如何区分冷/热数据
- 按照该访问的热度:热存储是需要立即访问的数据。存储的信息对业务至关重要,需要及时的响应那么就是热数据。
- 数据创建的时间:已经产生数月,数年,并且以后不再使用的数据。就是冷数据。比如想要统计昨天访问量,那么昨日之前的数据就不再重要。
冷数据的特点
数据量大:冷数据要求保存较长时间甚至所有时间的,这可能是热数据的数十倍到数百倍的数据量。
业务场景简单:只需要读取指定的数据即可,一般不会有复杂的查询。写入、删除都会批量处理,基本没有更新操作。
性能要求不高:不像一般应用要求查询数毫秒到数秒内返回,冷数据的查询可以容忍数十秒甚至更长时间才出结果,甚至可以做到异步处理,启动一个任务然后等待结果。
成本敏感:因为数据量庞大且访问频度低,不适合大量的投入。
冷数据的处理
- 几乎不需要查询
压缩备份,可以放到离线的存储设备中。 - 极地频率的查询。
使用对象存储,在需要查询的时候启动一个数据库实例进行查询。 - 经常需要查询
建立冷/热数据库,热库仅保留短时间的数据,超出的数据定时批量移到冷库中。应用系统内部做好区分,热数据可以直接通过应用系统访问,如果需要访问冷数据则需要走冷库查询。