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 JOIN
和STREAMTABLE
功能来实现。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 );