之前楼主在一家大型P2P公司,这是我们的数据仓库建设,分享给大家!
1.为什么要数据仓库
2.数据仓库的好处
3.数据仓库建设
4.数据仓库中会遇到的问题
1.为什么要数据仓库
为什么要建设数据仓库呢? 在传统数据库里面, 我们有很多东西是实现不了的
比如:
1) 问:我想看到任何一个用户的任何时间的任何一个状态! ,就相当于4维和5维的关系,我们无法看到昨天任何一个人的任何一个细节,我们看到的都是当前的, mysql数据库也一样,只是最终状态的展现,不保存历史, 当然,这和mysql建模也有关系.
答:mysql数据库是无法实现的, 因为没有保存历史. 但是hive可以
2) 问:mysql的数据怎么用作模型数据,怎么实现算法
答:mysql可以导下来excal表格数据,然后用excal表格数据作为数据源,但是当时太low, 如果数据量稍微一大,就GG了, 但是hive可以, 不需要导,直接读取就行
3) 问:mysql数据量如果多了,怎么办?
答:mysql数据量如果多了, 可以优化,可以增加表,增加库,增加配置等,但这不是最终解决办法,但是hive可以, 理论上可以无限叠加数据,只要你磁盘足够.
等等等等,实际应用中的例子太多了
2.数据仓库的好处
如果mysql没有使用kuttle等传统调度工具的话, 很难受的,每一次提取数据都得从底层去提取, 太耗功率,而且容错率极低.
数据仓库就不一样了, 所有的数据都开发成中间件, 都整理好成维度表,按照分区,增全量,干干净净,整整洁洁,数据提取,展示超级方便!
3.数据仓库建设
业务数据库 -> sa(按照业务需要根据时间抽取增全量,一般都是增量,无分区,每天最新分区) -> ods(数据明细层,有分区,每一天的sa层数据=ods的一个分区) -> dws(轻度汇总层,将所有的需要计算的数据,都提前计算好,放到dws层,按照情况定不定分区,我们做维度渐变,需要分区,)
业务数据库(mysql) ->sa(通过sqoop抽取) -> ods -> dws -> dwd -> dm -> app层
sa(缓冲层): 直接从mysql和MB用Sqoop抽取的,每天只保存一份,根据需求卡时间抽,包括全量增量
ods(数据明细层): 数据明细层,有分区,每一天的sa层数据=ods的一个分区,这一层的数据经过简单的ETL清洗,比如说去除一些不合逻辑的,去重的,字段命名不规范的.
dws(轻度汇总层):这一层的目的就是报表不需要再从ods层拿数据,如果有一个字段需要从ods层拿数据,那就是dw层没有做的好, 从ODS层中对用户的行为做一个初步的汇总,比如说要统计最近一周的投资人数,投资金额,投资次数,登录次数啊,频率啊,债转成功次数啊,金额啊,受让次数啊,等等,都可以做啊,也是按照主题去汇总的。这里的分区看公司的取舍吧,我们加了分区, 牺牲了磁盘空间, 用作渐变维度。
dwd(维度表,和dws是平行的):这一层主要解决常用不变的维度信息,让维度做一个轻度的汇总,我们可以不需要从各个源数据里面去重新找了, 比如说用户的常用身份信息,身份证,手机号码,登录地址,居住城市,学历等其他很多信息,这些信息来源于不同的表,我们也可以做一个轻度汇总。维度表一般不加分区,但是我们也加了分区的,也需要渐变维度,做一个渐变唯独。每天一份全量。 dwd和dws的区别就是,dwd是一些维度信息, dws是业务的一些维度信息,其实如果稍微笼统的话,两者是可以合并在一起的.
dm(报表层):这一层不多解释了,展示的报表层,我们磁盘多,加个分区把. 我们的业务人员(如运营,产品等)从HUE平台自己写sql查询
app(展示层): 也加分区,这一层和dm层的区别就是,这一层的数据都是要进mysql的, 然后通过mysql展示导web界面,而dm层所有的数据都不要进mysql,如果进了mysql, 就不再dm层了,直接到app层了
4.数据仓库中会遇到的问题
问题: 在从mysql数据抽取的时候,mysql数据会发生变化,而我们抽取过来的数据却是没有变化之前的
如果这点差别业务允许的话,自动忽略吧.
解决办法1: 集中资源先把所有数据抽取过来,先抽取过来后, 再ETL.你抽取的越快, 数据的差异越小,一般也在允许范围内.如果连这点差异都不能忍受的话,只能按照方法二了
解决办法2: 我们之前使用canal监控mysql变化日志, 然后跑日志,实现数据完全同步,这一块我们实现了, 但是我没有亲自做过.很遗憾.
解决办法还有很多,以后等我找到更好的办法后,再分享!
其实大数据里面应该出一个类似mysql的数据存储,业务数据全部存储到这个框架里面, 然后他可以无缝实时同步mysql, 而不需要sqoop导入了