首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据仓库搭建实例

注:本文写的过程为项目实际处理过程,与规范流程、大神们的流程有很多不合之处,限于本人能力,各位多理解。

目录:

1、背景

2、步骤

2.1、数据建模

2.2、数据抽取

2.3、数据存储

3、经验教训

3.1、维表的低耦合与适度耦合。

3.2、建模过程中的注意事项。

3.3、数据任务处理失败后的处理。

一、背景:取移动设备每小时上网详细数据(DPI数据),进行分拆处理后放入小时表、天表,留做业务后续使用。其中数据识别过程、小时表存放在数据方,天表通过限定查询量的方式导入到本方机房。

二、步骤:

1、数据库建模(也有人说是数据建模)

建模前首先确定数据是用来做什么,可能使用的场景,以及最优化存储(后续使用(例如查询)容易,存储空间小)。

数据源情况:DPI数据因为获取的滞后性,一般会与数据提供方滞后一日,所以不能做实时响应场景。DPI包含url、ua、imei、经纬度,时间等信息;其中过于敏感数据,如位置数据、实际购买商品,不在存储和分析范围之内。

确定数据粒度:(此步很重要,需要业务、数据、开发都知晓)

原始DPI数据,体量很大,一天十几个T,这需要将我们认为有用的数据抽取,同时相应的认为有用的关系不能丢掉过多、也不能保留过多。

比如 数据中 包含 我 今天 上午十点49分打开掌阅阅读,50分打开浏览器搜索小说,然后退出浏览器,然后打开掌阅,浏览20分钟后关闭,又打开浏览器,搜索多个词。

这里面包含了时间、app、频次、顺序、app使用时间、搜索词,搜索词顺序,浏览器,搜索引擎网站 信息。 这就需要来确定保留哪些数据,抛弃哪些数据。保留越多,信息越详细,但是相应需要的存储空间与计算空间也越大。一般来说,时序是很少有客户需要的,出于经济考虑,舍弃。但是本人做了什么还是需要记录的。

最终结果:保留客户使用app的小时id,site名称、app名称,关键词,基本能断定该人的行为;若需要有时间频次,可添加字段尝试。

确定数据维度:

首先是维表,维表需要考虑到数据识别结果表:一般来说,维表不建议多个因素放一起,比如app、site 本身可能有对应关系,但是数据识别结果如果分开,这里就没必要混合。但是有些项又最好放一起,比如手机型号,品牌,厂商,价格。

这里重点提一下,app、site都会有大量的垃圾数据,比如cdn的url,这种本身是利用价值比较低的,建议在数据定义阶段就排除(定义唯一后,置为失效,维护方便)

其次是数据识别结果表,结果表需要根据不同的数据用途、数据的类似程度来存储。

2、数据抽取(远程传输,跨公司部门传输)

基本原则: 抽取过程数据无损,节省资源,维护简单,版本变动小。

项目的数据抽取,逻辑是:在提供方取数据,填充到redis,然后本方查询redis,将数据查询后写入本地hadoop,根据各种数据维表和规则,对结果进行拆分转换。

dmp_redis_table-》分拆为 stags_bd,id_rel_bd

3、数据存储

基本要求:数据块大小适中,后续使用简单,合理使用分区。

这里重点说一下 ,hadoop对小文件的处理,是比较头疼的,如果有大量数据,尽量避免几千几万个小文件同时生成或使用的情况,会导致查询、写入时候耗费大量时间。

将上一步抽取到的数据,按业务需求分拆到表 stdtags_bd,user_rel_bd,个人测试认为单个存储文件大小为400M-1G为最优。

三、经验教训以及注意事项:

1、维表的低耦合与适度耦合。

这里延续 二-1 的数据维度的详细解释。在定义维表方面,如果与其他维度关联不大,尽量单独建表,容易维护和查询;如app名称,domain名称,识别搜索关键词,识别用户兴趣和倾向。

如果两者之间关联较大,如用户设备的信息,都与具体型号关联,可以做到一起;某些特殊品类app或者网站,也可以把分类写到定义维表,这样下一步使用都相对简单。

2、建模过程中的注意事项。

主要是建成的库表要切实符合已有业务需求,适度覆盖可能的业务需求,能够适度升级扩展。过程中主要是与各个同事和业务方的沟通,然后通过对业务逻辑的梳理,进行建模。

落实到数据库上,有业务表的字段制定、生成的文件数、文件大小的控制。

表和表内字段,最好在这一步都定义清晰明了,尽量符合整个部门甚至多个部门对数据处理的需求,切实符合已有业务需求,适度考虑未来可能的业务需求,可以预留几个字段,预留字段一般放在行尾。

适当的数据分区:有效分区能够分割大文件,提高后续使用效率,但是过多的分区会导致维护麻烦,后续使用中可能会出现无法查询全体需求分区的情况(数据库参数和能力限制)

3、数据任务处理失败后的处理。

这里包含两种:

1、数据库内处理时异常和失败

这里需要明确的是,数据处理失败率多少可以接受。在hadoop处理数据中,不能保证每一次都丝毫不差;如果数据源数据过大,处理时集群偶尔抽风,都可能导致处理失败,是否能够接受,不接受的话是否重新执行。这里一般是在MAPReduce过程中通过程序重试完成,设置最多重试次数,若还失败,放弃。

2、程序流程失败

程序流程的失败,包括升级测试不充分导致结果异常、中途网络延迟、网络间断、内存需求超过实际提供量导致泄露、操作人员误操作杀死进程、操作人员主动杀死进程等情况。

大体要求:

1\每一步都可单独重新执行,此步至关重要!因为谁都无法保证流程永远畅通,一旦出问题,从头再来的代价往往是几个小时的计算量,会让集群和业务崩溃。

2\其他诸如网络延迟错误、部分数据丢失或重复等问题,需要考虑适度的容错机制。例如在MapReduce阶段设定容许失败率;设定程序每个阶段可以尝试执行的次数。

3、开发和持有整个流程启动的备份代码,哪怕仅仅是执行脚本。一旦程序和集群出现崩溃,能够迅速有效的进行恢复。

参考:

1、业务文档

2、http://www.cnblogs.com/arnold/articles/2311192.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180608G236J800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券