数据仓库Hive和数据湖以及Impala, 数仓建模总结与高频运用

1.什么是数据仓库?

数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,是一种面向BI活动的数据管理系统。

一个典型的数据仓库系统通常包括数据源、数据存储和管理、OLAP服务器、前端工具和应用4个部分

2、数据湖的概念

数据湖是一类存储数据自然、原始格式的存储系统,存储的内容通常是对象块和文件

3.数据湖能解决哪些问题:

1.数据分散,存储散乱,形成数据孤岛

2.存储成本问题

3.sql无法满足分析需求(通过机器学习挖掘数据的价值

4、存储、计算可扩展性不足

5、业务模型不定,无法预先建模

4.湖仓一体架构重要一点是能够无缝打通“湖里”和“仓里”的数据,使他自由流动

hive简介:

在某种程度上可以看作用户编程接口,其本身是不存储和处理数据,而是依赖HDFS来存储数据,依赖mapreduce或者spark这些去处理数据。它支持有限索引,而传统数据库支持复杂索引

hive系统架构:

hive主要由用户接口模块、驱动模块以及元数据存储模块3个模块组成

hive实时性不好,查询延迟较高

impala在性能上比hive快很多

impala是由cloudera开发的查询系统,它提供了sql语义,能够查询存储在hadoop的hdfs和hbase上的pb级别海量数据,它的运行依然需要依赖于hive的元数据

Hive的主要特性是什么?

hive的查询语言是hiveQL,它将结构化数据映射到Hadoop的分布式文件系统(HDFS)上,支持大规模数据集的分布式处理。

Hive的工作原理

户使用HiveQL编写查询语句,Hive将其编译成MapReduce任务或其他计算引擎的任务,询任务通过Hive驱动程序提交给计算引擎执行,计算引擎将任务转换为MapReduce作业或其他计算模型进行分布式计算,结果返回给用户。

Hive的数据存储组织

Hive使用HDFS存储数据,数据以表的形式组织,每个表包含行和列。

Hive的性能调优技巧

选择合适的数据存储格式(如Parquet或ORC)提高查询性能和压缩比。

Hive 的几种访问方式:

通过Hive CLI访问

通过Beeline访问

Beeline是Hive提供的一个基于JDBC的命令行工具,支持通过JDBC连接到HiveServer2。

通过Hue访问

Hue(Hadoop User Experience)是一个开源的Web界面

通过JDBC/ODBC访问

通过Hive Metastore访问

Hive Metastore是Hive的元数据存储服务

state store的作用:

state store 是一种用于管理和存储应用程序状态的机制,通常用于分布式系统中。

作用:

状态持久化

状态共享

状态查询

状态一致性

Hive数据仓库分层架构:

.ODS(Operational Data Store,操作数据存储层)

作用:ODS 层是数据仓库的最底层,直接对接源系统,存储原始数据。

 DWD(Data Warehouse Detail,数据仓库明细层)

作用:对 ODS 层的数据进行清洗、转换和整合,生成高质量的明细数据。

 DWS(Data Warehouse Summary,数据仓库汇总层)

作用:基于 DWD 层的数据,按照业务需求进行聚合和汇总,生成宽表或主题表。

 ADS(Application Data Store,应用数据层)

作用:面向最终业务需求,提供高度聚合的数据,直接支持报表、分析和应用。

 在hive中一般采用的是维度建模
维度建模的核心概念
  • 事实表(Fact Table)

    • 存储业务过程中的度量数据(如销售额、订单数量)。
    • 通常包含外键,关联到维度表。
    • 维度表(Dimension Table)

    • 存储描述性数据(如产品、客户、时间等)。
    • 通常包含主键,用于与事实表关联。
       常见的维度建模方法
    • 星型模型(Star Schema)

      • 一个事实表与多个维度表直接关联。
      • 结构简单,查询性能高。
      • 雪花模型(Snowflake Schema)

      • 维度表进一步规范化,形成多层关联。
      • 节省存储空间,但查询性能较低。
      • 星座模型(Galaxy Schema)

        • 多个事实表共享维度表。
        • 适用于复杂的业务场景。
        • Hive数据倾斜:
        • 什么是数据倾斜

        • 数据倾斜的定义

          数据倾斜是指在分布式计算中,数据分布不均匀,导致某些节点处理的数据量远大于其他节点,形成数据热点。在MapReduce任务中,大量相同的key被分配到同一个reduce节点,导致该节点负载过重,而其他reduce节点却处于空闲状态,造成资源分配不均。

        • 数据倾斜产生的原因

        • key分布不均匀:某些key的出现频率远高于其他key,导致这些key被分配到同一个reduce节点。
        • 业务数据本身的特性:业务数据中某些字段的值具有高度集中性,如用户ID、地区等。
        • 建表考虑不周全:表的分区或分桶设计不合理,导致数据分布不均。
        • SQL语句本身存在数据倾斜:某些SQL查询语句(如JOIN操作)可能导致数据倾斜。
        • SET hive.exec.dynamic.partition=true;
          SET hive.exec.dynamic.partition.mode=nonstrict;
          
          INSERT OVERWRITE TABLE dynamic_partitioned_table
          PARTITION (partition_key)
          SELECT * FROM original_table;
          

          具体的数据倾斜及解决方法

          空值产生的数据倾斜

          解决方法:赋予空值新的key值,避免空值集中到同一个reduce节点。

          不同数据类型关联产生的数据倾斜

          解决方法:在JOIN操作时,确保两个表关联字段的数据类型一致。例如,将数字类型的ID转换为字符串类型的ID。

          数据倾斜的解决方法总结

          重新分区(Repartitioning)

          重新将表分区,使数据更均匀地分布在各个分区中。可以使用Hive的INSERT OVERWRITE语句和DISTRIBUTE BY子句来实现。

          INSERT OVERWRITE TABLE new_table
          SELECT * FROM old_table
          DISTRIBUTE BY new_key;
          

          聚合转换(Aggregation Conversion)

          将一些大的聚合操作拆分成多个小的聚合操作,然后将结果再聚合起来。这样可以减少单个任务要处理的数据量,从而减轻数据倾斜的影响。可以使用Hive的UNION ALL语句和子查询来实现。

           
          SELECT key, SUM(value)
          FROM (
            SELECT key, SUM(value) AS value
            FROM table
            GROUP BY key
            UNION ALL
            SELECT key, SUM(value) AS value
            FROM table
            GROUP BY key
          ) subquery
          GROUP BY key;
          

          随机分桶(Randomized Bucketing)

          将表分成多个桶(Bucket),并在插入数据时将数据随机分配到这些桶中。这样可以使数据更均匀地分布在各个桶中,从而减轻数据倾斜的影响。可以使用Hive的CLUSTER BY子句和SORT BY子句来实现。

           
          CREATE TABLE bucketed_table
          CLUSTERED BY (key) INTO 10 BUCKETS
          AS SELECT * FROM original_table;
          
          
          布隆过滤器(Bloom Filter)

          使用布隆过滤器来过滤掉一些不需要处理的数据,从而减少单个任务要处理的数据量,从而减轻数据倾斜的影响。可以使用Hive的MAP JOINSTREAMTABLE功能来实现。

          SELECT /*+ MAPJOIN(small_table) */ *
          FROM large_table
          JOIN small_table
          ON large_table.key = small_table.key;
          

          动态分区(Dynamic Partitioning)

          使用Hive的动态分区功能来动态生成分区。这样可以避免一些特定的分区数据过大而导致的数据倾斜问题。

        •  

          SET hive.exec.dynamic.partition=true;
          SET hive.exec.dynamic.partition.mode=nonstrict;

          INSERT OVERWRITE TABLE dynamic_partitioned_table
          PARTITION (partition_key)
          SELECT * FROM original_table;
           

          什么是事实表和维度表
        • 事实表

          事实表是数据仓库中的核心表,用于存储业务过程中的度量事件。事实表通常包含数值型数据(称为事实),这些数据是与业务过程相关的可量化指标,如销售额、数量等。事实表通常与维度表相关联,通过外键引用维度表中的主键。

          事实表的类型
        • 事务事实表 (Transaction Fact Table):记录特定事件的度量值,如每次销售、每次交易等。每个事件通常对应一条记录。
        • 周期快照事实表 (Periodic Snapshot Fact Table):定期记录业务状态,如每月库存、每日账户余额等。它提供特定时间点的快照。
        • 累积快照事实表 (Accumulating Snapshot Fact Table):记录业务过程的多个阶段,如订单从下单到交付的全过程。它通常包含多个时间戳,用于跟踪过程的各个阶段。
        • 事实表的特点
        • 包含数值型数据(事实)。
        • 通常与多个维度表关联。
        • 记录业务过程中的度量事件。
        • 数据量通常较大,因为记录了大量的业务事件。
        • 事实表的作用
        • 提供业务过程中的可量化指标。
        • 支持复杂的分析和报表生成。
        • 帮助理解业务绩效和趋势。
        • 维度表

          维度表是数据仓库中用于描述业务对象特征的表。它通常包含描述性信息,如产品名称、客户信息、时间等。维度表通过主键与事实表关联,为事实表提供上下文信息。

          维度表的特点
        • 包含描述性数据。
        • 通常具有较少的记录,但字段较多。
        • 提供业务对象的详细信息。
        • 通过主键与事实表关联。
        • 维度表的作用
        • 为事实表提供上下文信息。
        • 支持数据的分组、过滤和聚合。
        • 帮助用户理解业务数据的含义。
        • 确定业务过程:明确要分析的业务过程,如销售、库存等。
        • 选择事实:确定与业务过程相关的度量值,如销售额、数量等。
        • 选择粒度:确定事实表的粒度,即每条记录代表的业务事件级别,如每次交易、每天等。
        • 添加外键:为事实表添加与维度表关联的外键。
        • 设计表结构:创建表结构,包含事实字段和外键字段。
        • CREATE TABLE sales_fact (
              sales_id INT PRIMARY KEY,
              product_id INT,
              customer_id INT,
              time_id INT,
              sales_amount DECIMAL(10, 2),
              quantity INT,
              FOREIGN KEY (product_id) REFERENCES product_dim(product_id),
              FOREIGN KEY (customer_id) REFERENCES customer_dim(customer_id),
              FOREIGN KEY (time_id) REFERENCES time_dim(time_id)
          );
          创建维度表
        • 确定业务对象:明确要描述的业务对象,如产品、客户、时间等。
        • 选择维度属性:确定描述业务对象的属性,如产品名称、客户地址、日期等。
        • 设计表结构:创建表结构,包含主键和维度属性字段。
        • CREATE TABLE product_dim (
              product_id INT PRIMARY KEY,
              product_name VARCHAR(255),
              category VARCHAR(255),
              price DECIMAL(10, 2)
          );
          
          CREATE TABLE customer_dim (
              customer_id INT PRIMARY KEY,
              customer_name VARCHAR(255),
              address VARCHAR(255),
              city VARCHAR(255),
              country VARCHAR(255)
          );
          
          CREATE TABLE time_dim (
              time_id INT PRIMARY KEY,
              date DATE,
              month INT,
              year INT
          );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值