互联网行业,除了数据量大之外,业务时效性要求也很高,甚至很多是要求实时的,另外,互联网行业的业务变化非常快,不可能像传统行业一样,可以使用自顶向下的方法建立数据仓库,一劳永逸,它要求新的业务很快能融入数据仓库中来,老的下线的业务,能很方便的从现有的数据仓库中下线。
整体架构:
数据仓库的逻辑分层架构:
1.数据源
数据源,顾名思义就是数据的来源,互联网公司的数据来源随着公司的规模扩张而呈递增趋势,同时自不同的业务源,比如埋点采集,客户上报等。
2.ODS层
数据仓库源头系统的数据表通常会原封不动地存储一份,这称为ODS(OperationDataStore)层,ODS层也经常会被称为准备区(Stagingarea),它们是后续数据仓库层(即基于Kimball维度建模生成的事实表和维度表层,以及基于这些事实表和明细表加工的汇总层数据)加工数据的来源,同时ODS层也存储着历史的增量数据或全量数据。
3.DW层
据仓库明细层(DataWarehouseDetail,DWD)和数据仓库汇总层(DataWarehouseSummary,DWS)是数据仓库的主题内容。DWD和DWS层的数据是ODS层经过ETL清洗、转换、加载生成的,而且它们通常都是基于Kimball的维度建模理论来构建的,并通过一致性维度和数据总线来保证各个子主题的维度一致性。
4.DWS层
应用层汇总层主要是将DWD和DWS的明细数据在hadoop平台进行汇总,然后将产生的结果同步到DWS数据库,提供给各个应用。
数据采集:
数据采集的任务就是把数据从各种数据源中采集和存储到数据存储上,期间有可能会做一些简单的清洗。
比较常见的就是用户行为数据的采集,先做sdk埋点,通过kafka实时采集到用户的访问数据,再用spark做简单的清洗,存入hdfs作为数据仓库的数据源之一。
数据存储:
随着公司的规模不断扩张,产生的数据也越来越到,像一些大公司每天产生的数据量都在PB级别,传统的数据库已经不能满足存储要求,目前hdfs是大数据环境下数据仓库/数据平台最完美的数据存储解决方案。
在离线计算方面,也就是对实时性要求不高的部分,Hive还是首当其冲的选择,丰富的数据类型、内置函数;压缩比非常高的ORC/PARQUET文件存储格式;非常方便的SQL支持,使得Hive在基于结构化数据上的统计分析远远比MapReduce要高效的多,一句SQL可以完成的需求,开发MR可能需要上百行代码;而在实时计算方面,flink是最优的选择,不过目前仅支持java跟scala开发。
数据同步:
数据同步是指不同数据存储系统之间要进行数据迁移,比如在hdfs上,大多业务和应用因为效率的原因不可以直接从HDFS上获取数据,因此需要将hdfs上汇总后的数据同步至其他的存储系统,比如mysql;sqoop可以做到这一点,但是Sqoop太过繁重,而且不管数据量大小,都需要启动MapReduce来执行,而且需要Hadoop集群的每台机器都能访问业务数据库;阿里开源的dataX是一个很好的解决方案。