zoukankan      html  css  js  c++  java
  • hive数据仓库建设

    原文:https://www.jianshu.com/p/4e72b22edf49

    1、数据仓库与数据库

    数据仓库是数据库概念的升级,和数据库相比,数据仓库要比数据库更加庞大;
    数据仓库主要用于分析数据,数据库主要用于捕获数据;
    数据仓库主要存储历史数据,数据库存储在线交易数据;
    数据仓库的基本元素是维度表,数据库的基本元素是事实表。
    数据仓库的组成部分包括数据抽取工具、数据库、信息发布系统、数据仓库管理、元数据、数据集市、访问工具。
    数据仓库的数据建模分为四个阶段,分别是业务建模、领域概念建模、逻辑建模、物理建模。

    2、为什么要数据仓库

    为什么要建设数据仓库呢? 在传统数据库里面, 我们有很多东西是实现不了的;
    比如:
    
    1) 问:我想看到任何一个用户的任何时间的任何一个状态! ,就相当于4维和5维的关系,我们无法看到昨天任何一个人的任何一个细节,我们看到的都是当前的,  mysql数据库也一样,只是最终状态的展现,不保存历史, 当然,这和mysql建模也有关系.
    
    答:mysql数据库是无法实现的, 因为没有保存历史.  但是hive可以
    
    
    2) 问:mysql的数据怎么用作模型数据,怎么实现算法
    
    答:mysql可以导下来excal表格数据,然后用excal表格数据作为数据源,但是当时太low, 如果数据量稍微一大,就GG了, 但是hive可以, 不需要导,直接读取就行
    
    
    3) 问:mysql数据量如果多了,怎么办?
    
    答:mysql数据量如果多了, 可以优化,可以增加表,增加库,增加配置等,但这不是最终解决办法,但是hive可以, 理论上可以无限叠加数据,只要你磁盘足够.
    
    等等等等,实际应用中的例子太多了;

    3、数据仓库的好处

    如果mysql没有使用kuttle等传统调度工具的话, 很难受的,每一次提取数据都得从底层去提取, 太耗功率,而且容错率极低.
    
    
    数据仓库就不一样了, 所有的数据都开发成中间件, 都整理好成维度表,按照分区,增全量,干干净净,整整洁洁,数据提取,展示超级方便!

    4、数据仓库的建设

    业务数据库 -> 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层了

    5、数据仓库中会遇到的问题

    问题: 在从mysql数据抽取的时候,mysql数据会发生变化,而我们抽取过来的数据却是没有变化之前的
    
    如果这点差别业务允许的话,自动忽略吧.   
    
    解决办法1: 集中资源先把所有数据抽取过来,先抽取过来后, 再ETL.你抽取的越快, 数据的差异越小,一般也在允许范围内.如果连这点差异都不能忍受的话,只能按照方法二了
    
    解决办法2: 我们之前使用canal监控mysql变化日志, 然后跑日志,实现数据完全同步,这一块我们实现了, 但是我没有亲自做过.很遗憾.
    
    解决办法还有很多,以后等我找到更好的办法后,再分享!
  • 相关阅读:
    Window frames[]集合(转)
    ObjectDataSource 如何传递查询参数
    前台如何解析json格式 以及后台如何生成json格式
    Burrows–Wheeler transform
    windows xp中安装PadWalker
    ORA01207:文件比控制文件更新 旧的控制文件
    如何看懂NCBI BLAST输出结果
    Perl getopts
    blast formatdb 使用方法介绍
    Randfold安装
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/12746246.html
Copyright © 2011-2022 走看看