数据仓库DW

数据仓库具备 采集数据、存储数据、分析和计算 的功能,最后得出一些有用的数据,一些目标数据来使用。

采集来自不同源的数据,然后对这些数据进行分析和计算得出一些有用的指标,提供数据决策支持。

数据的来源有:系统的业务数据、用户的行为数据、爬虫数据等。

数据仓库包含:实时数据仓库、离线数据仓库。

数仓分层

数据仓库中的数据一般经过以下几层处理,每层都对数据进行特定的处理:参考来自

其实这个分层只是主流是这样的,具体要分几层,怎么分,还是要根据自己的业务来,怎么分层好分析数据,就怎么分。

1.ODS ODS主要完成:

(1)保持数据原貌不做任何修改,保留历史数据,储存起到备份数据作用,采集过来是什么数据就存储什么数据;

(2)数据一般采用lzo、Snappy、parquet等压缩格式;

(3)创建分区表,防止后续的全表扫描,减少集群资源访问数仓的压力,一般按天存储在数仓中。

2.DWD

DWD主要完成:

1. 数据清洗 (1)去除空值、脏数据、超过极限范围的数据。 (2)过滤核心字段无意义的数据,比如订单表中订单 id 为 null,支付表中支付 id 为空 (3)将用户行为宽表和业务表进行数据一致性处理

        清洗的手段包括Sql、mr、rdd、kettle、Python等等。清洗掉数据不能太多也不能很少。合理范围:1 万条数据清洗掉 1 条。

2. 脱敏         对手机号(181****7089)、身份证号等敏感数据脱敏

3. 维度退化         对业务数据传过来的表进行维度退化和降维。(商品一级二级三级、省市县、年月日)

4. 压缩

        LZO,列式存储 parquet

3.DWS

        以DWD为基础,进行轻度的汇总。预聚合。         DWS层就是关于各个主题的加工和使用,这层是宽表聚合值,是各个事实表的聚合值。这里做轻度的汇总会让以后的计算更加的高效,如:统计各个主题对象计算7天、30天、90天的行为, 应对特殊需求(例如,购买行为,统计商品复购率)会快很多不必走ODS层反复拿数据做加工。     

        这层会把每个用户单日的行为聚合起来组成一张多列宽表,以便之后关联用户维度信息后进行,不同角度的统计分析。

        涉及的主题包括:访客主题、用户主题、商品主题、优惠券主题、活动主题、地区主题等

      

4.DWT         这层涉及的主题和DWS层一样包括:访客主题、用户主题、商品主题、优惠券主题、活动主题、地区主题等。只不过DWS层的粒度是对当日用户汇总信息,而DWT层是对截止到当日、或者近7日、近30日等的汇总信息。

        以用户主题这个来举列:

*DWS层:用户主题层是记录某一个用户在某一天的汇总行为。

*DWT层:用户主题层是记录某一个用户截止在当日的汇总行为。

5.ADS

统计指标。 ADS层数据是专门给业务使用的数据层,这层是面向业务定制的应用数据层。

ADS主要完成:

(1)提供为数据产品使用的结果数据、指标等。

(2)提供给数据产品和数据分析使用的数据,一般会存放在 ES、MySQL等系统中供线上系统使用,也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。如报表数据,或者说那种大宽表。

        这个项目中ADS层也是包含有多个主题:设备主题、会员主题、商品主题、营销主题、地区主题、访客主题、用户主题、订单主题、优惠券主题、活动主题等等。每个主题都包含多个指标的计算。

离线数仓

通常是批处理数据,数据可能一直产生,也有可能断断续续的产生,但是这些数据我先攒着,攒成一批后再处理。一般攒一天处理一次,所以是批处理数据量大,处理时间长。

离线数仓架构参考图

业务数据存储在MySQL,用户行为数据存储在日志文件中。这两个数据源都要先采集进来然后进行分析计算等,因为数据量会比较大,所以采用Hadoop的HDFS存储。

业务数据在MySQL中,由于是离线数仓,所以每天进行全量同步一次数据到HDFS中即可,这边我也不知道为啥还要进行增量同步到kafka中,然后由消费者发送给HDFS存储。

日志文件由flume监控采集,又因为日志文件比较大,如果flume采集完就直接发送给HDFS效率不好,所以flume采集完先发送给kafka的主题中,接着flume消费者订阅这个主题,消费日志文件发送给HDFS存储,kafka消息队列在这起消峰的作用。

经过上面的步骤后,数据就全部来到了HDFS中供使用。数据经过ODS、DWD、DWS、ADS层层处理产生想要的结果后,数据处理经过这些层,这些层总要有先后,定时任务调度的作用就是:如果数据在ODS处理好了,就可以自动进入到下一层DWD继续处理。层层处理后的想要结果由DataX将结果每日同步到MySQL中方便进行后续的使用,比如Superset可视化展示。

实时数仓

数据源源不断的来,和离线数仓相反,数据不攒了,一有数据来我就处理,数据跟流水一样来,所以是流式处理数据,处理时间较短。

实时数仓用来处理那些实时性高的数据。

实时数仓架构参考图

实时的话,创建flink消费者从kafka中取出数据,那我就理解了为啥业务数据也要增量同步发给kafka了,因为实时处理需要,所以kafka就是ods层,flink进行简单处理后发送给DWD层。

flume采集文件案例

以下的架构就是一个实时数仓的简单架构,flume一直监控数据文件,只要一有文件来,就会被flume采集然后发给kafka主题,接着就会被flink消费。

用户行为数据:用户在使用产品过程中,通过埋点收集与客户端产品交互过程中产生的数据,并发往日志服务器进行保存。比如页面浏览、点击、停留、评论、点赞、收藏等。由于用户的行为数据比较多,所以用户行为数据通常存储在日志文件中。

 在flume的家目录中,采集一个job文件夹存放flume的配置文件,file_to_kafka.conf:

a1.sources = r1

a1.channels = c1

#配置source

a1.sources.r1.type = spooldir

a1.sources.r1.spoolDir = /mydata/spoolingDir

#配置channel org.apache.flume.channel.kafka.KafkaChannel

a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel

a1.channels.c1.kafka.bootstrap.servers = 192.168.10.128:9092

a1.channels.c1.kafka.topic = topic_log

a1.channels.c1.parseAsFlumeEvent = false

#组装

a1.sources.r1.channels = c1

启动:

bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.logger=info,console

bin/flume-ng:这是启动 Flume 的可执行文件。agent:指定要运行的 Flume 组件类型,这里是代理(agent)。-n a1:指定代理的名称,这里是 "a1"。-c conf/:指定配置文件的目录,Flume 会在该目录下查找配置文件。-f job/file_to_kafka.conf:指定要使用的配置文件的路径,这是 Flume 的配置文件,它描述了数据传输的配置。-Dflume.root.logger=info,console:设置 Flume 的日志级别和输出方式。在此设置中,日志级别为 "info",并将日志输出到控制台。

数仓技术选型

数据采集:如果数据是以文件形式存在可以使用flume监控采集,MySQL中的数据可以使用DataX采集

数据存储:数据量比较小可以用MySQL存储,数据量大用HDFS

数据计算:实时性要求高用flink流式处理

ETL和ELT

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: