数分-理论-大数据6-Hive(数据仓库)
(数据分析系列)
文章目录
1知识点
- 数据仓库
- Hive基础
- Hive核心
- Hive系统结构
- 实战应用
2具体内容
2.1数据仓库
2.1.1起源
基于分析型决策的优化,需高性能的完成用户查询,提出数据仓库
2.1.2数仓概念
1.概念
-
数据仓库是一个
面向主题的、集成的、非易失的、随时间变化的
,用来
支持管理人员决策
的数据集合,数据仓库中包含了
粒度化
的企业数据。 - 企业数据仓库有效集成了来自不同部门、不同地理位置、具有不同格式的数据,为企业管理决策者提供了企业范围内的单一数据视图。
2.特征
主体性+集成性+非易失性+时变性
-
主题性
- 针对不同业务进行归类分析,抽象为主题,对应某一分析领域涉及的分析对象
- 抽象层次,每个领域各有逻辑内核,互不交叉
-
集成性
- 统一口径,统一数据来源中的歧义、单位、字长等元素进行总和计算,聚合成新数据
-
非易失性
- 保存历史业务数据,根据业务每隔一段时间导入新的数据,不会轻易丢失改变
-
时变性
- 反应一个业务过程,业务变化会随着改变,适应分析决策
2.1.3体系结构
数据源、数据存储和管理、数据服务以及数据应用
- 数据源:数仓的数据来源,外部数据+业务系统+文档资源
- 数据存储和管理:存储和管理数据,数据仓库+数据集市+数据仓库监视+运行与维护工具+元数据管理
- 数据服务:为前端工具和应用提供数据服务,从数仓获取数据提供给前端,或通过OLAP服务器为前端应用提供复杂数据服务
- 数据应用:直接面向最终用户,数据工具+自由报表工具+数据分析工具+数据挖掘工具+应用系统
2.1.4存在挑战
- 无法满足快速增长的海量数据存储需求
- 无法有效处理不同类型的数据
- 计算和处理能力不足
2.2Hive基础
2.2.1概述
- 建立在hadoop上的一种数仓工具
-
将
结构化、半结构化
的数据文件映射为一张
数据库表
-
基于数据库表,提供一种类sql的查询模型
HQL
- 访问、分析存在Hadoop文件中的大型数据集
注意:
- 本身不具备存储功能
-
核心:将HQL转换为MapReduce程序,提交到Hadoop集群执行
特点:
- 类SQL的查询语言HQL
- 可自定义用户函数UDF和存储格式
- 为超大数据集设计计算和存储能力,集群扩展容易
- 统一元数据管理,可与preso\impala\sqarksql共享数据
- 执行延迟高,不适实时处理,时候海量数据离线处理
2.2.2背景
- 成本:MR需要学java,不易复杂查询
- 建立分析型数仓:支持类SQL的查询及支持自定义函数,可做数仓工具
2.2.3Hive与Hadoop生态系统
- HDFS:分布式文件系统,存储海量数据
- MapReduce:分布式并行编程模型,批处理,实现高性能计算
- Hive:数据仓库,不存储和处理数据,用HQL编写处理逻辑,转换为MR任务执行
- Pig:Hive的替代工具,数据流语言和运行环境,适用于在Hadoop平台查询半结构化数据集,用于数据抽取(ETL),将外部数据装载到Hadoop集群,转换为用户需要的数据格式
-
HBase:分布式数据库,面向列式存储、分布式、可伸缩的数据库,它可以提供数据的实时访问功能
- Hive只能处理静态数据,BI报表数据
- Hive为了减少复杂MR应用程序的编写
- HBase为了实现对数据的实时访问
2.2.4对比
底层依赖HDFS+MapReduce
对比内容 | Hive | 传统数据库 |
---|---|---|
数据存储 | HDFS | 本地文件系统 |
索引 | 支持有限索引 | 支持复杂索引 |
分区 | 支持 | 支持 |
执行引擎 | MapReduce、Tez、Spark | 自身的执行引擎 |
执行延迟 | 高 | 低 |
扩展性 | 好 | 有限 |
数据规模 | 大 | 小 |
2.2.5模拟实现
1,jingjing,26,hangzhou
2,wenrui,26,beijing
3,dapeng,26,beijing
4,tony,15,hebei
-
需求:HDFS文件系统的文件,编写SQL,统计来自北京的年龄大于20的人数
-
分析:对表操作,先找到文件与表的对应关系,实现表与文件的映射
- 表位置
- 字段位置
- 内容读取的分隔操作
-
Hive对SQL语句语法校验,根据记录的元数据对sql解析,制定执行计划,转为MR程序执行,结果封装后返回给用户
2.3Hive核心
2.3.1数据类型
1.基本数据类型
大类 | 类型 |
---|---|
Integers(整型) | TINYINT:1字节的有符号整数; SMALLINT:2字节的有符号整数;INT:4字节的有符号整数; |
BIGINT:8字节的有符号整数 | |
Boolean(布尔型) | BOOLEAN:TRUE/FALSE |
Floating point numbers(浮点型) | FLOAT:单精度浮点型; |
DOUBLE:双精度浮点型 | |
Fixed point numbers(定点数) | DECIMAL:用户自定义精度定点数,比如 DECIMAL(7,2) |
String types(字符串) | STRING:指定字符集的字符序列;VARCHAR:具有最大长度限制的字符序列;CHAR:固定长度的字符序列 |
Date and time types(日期时间类型) | TIMESTAMP:时间戳; |
TIMESTAMP WITH LOCAL TIME ZONE:时间戳,纳秒精度;DATE:日期类型 | |
Binary types(二进制类型) | BINARY:字节序列 |
- TIMESTAMP :提交的时间按照原始时间保存,查询时,也不做任何转换
- TIMESTAMP WITH LOCAL TIME ZONE:用户提交TIMESTAMP给数据库时,会被转换成数据库所在的时区来保存。查询时,则按照查询客户端的不同,转换为查询客户端所在时区的时间。
2.隐式转换:子类型到祖先类型允许隐式转换
-
STRING类型可隐式转换为DOUBLE类型
3.复杂类型
类型 | 描述 | 示例 |
---|---|---|
STRUCT |
类似于对象, 字段 的集合,字段的类型可以不同,可以使用名称.字段名方式进行访问 |
STRUCT(‘xiaoming’, 12 , ‘2018-12-12’) |
MAP |
键值对 的集合,可以使用名称[key]的方式访问对应的值 |
map(‘a’, 1, ‘b’, 2) |
ARRAY |
数组 是一组具有相同类型和名称的变量的集合,可以使用名称[index]访问对应的值 |
ARRAY(‘a’, ‘b’, ‘c’, ‘d’) |
CREATE TABLE students(
name STRING, -- 姓名
age INT, -- 年龄
subject ARRAY<STRING>, -- 学科
score MAP<STRING,FLOAT>, -- 各个学科考试成绩
address STRUCT<houseNumber:int, street:STRING, city:STRING, province:STRING> -- 家庭居住地址
) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
2.3.2数据模型
- 描述Hive组织、管理和操作数据的方式
-
Hive数据存于HDFS,默认一个根目录,在hive-site.xml配置数据的存储路径
1.库 - 默认数据库default
- 创建不同数仓库database
- 相当于关系数据库的命名空间,将用户和数据库的表隔离
2.表
-
表相关的元数据是存储在关系数据库
-
分内部表,外部表
1)加载数据和创建表:
- 内:过程分开,加载时数据被移动到数仓目录,对数据的访问在数仓目录实现
-
外:是一个过程,访问即读取HDFS内数据
2)删除表: - 内:表内数据和元数据同步被删除(数据移到数仓目录了)
-
外:数据在HDFS,删除表不影响数据
3)创建表: - 默认创建内部表
- External创建外部表
内容 | 内部表 | 外部表 |
---|---|---|
数据存储位置 | 内部表数据存储的位置由hive.Metastore.warehouse.dir参数指定,默认情况下,表的数据存储在HDFS的/user/hive/warehouse/数据库名.db/表名/目录下 | 外部表数据的存储位置创建表时由Location参数指定 |
导入数据 | 在导入数据到内部表,内部表将数据移动到自己的数据仓库目录下,数据的生命周期由Hive来进行管理 | 外部表不会将数据移动到自己的数据仓库目录下,只是在元数据中存储了数据的位置 |
删除表 | 删除元数据(metadata)和文件 | 只删除元数 |
3.分区:优化
- 减少全表扫描
- 存储:表的主目录文件夹下的子文件夹,子文件夹的名字表示所定义的分区列名字
4.分桶:拆分数据文件本身
- 根据表中字段(例如,编号ID)的值,经过hash计算规则,将数据文件划分成指定的若干个小文件
-
优化join查询
和
方便抽样查询
。
2.4Hive系统结构
用户接口模块
+
驱动模型
+
元数据存储模块
2.4.1用户接口模块
- 实现外部应用对Hive的访问
- 包括:CLI、Hive网页接口(Hive Web Interface,HWI)、JDBC、ODBC、Thrift Server等
-
操作数据:
-
CLI(command-line shell): Hive自带的一个
命令行
客户端工具 - HWI(Thrift/JDBC):Hive的一个简单网页,JDBC、ODBS和Thrift Server可以向用户提供编程访问的接口。用户可以按照标准的JDBC的方式,通过Thrift协议操作数据。
-
CLI(command-line shell): Hive自带的一个
2.4.2驱动模块Driver
- 实现:MR,把 HiveQL语句转换成一系列MapReduce作业,所有命令和查询都会进入驱动模块,通过该模块对输入进行解析编译,对计算过程进行优化,然后按照指定的步骤执行。
- 包括:编译器、优化器、执行器等
- 执行引擎:可以是 MapReduce、Tez或Spark等
2.4.3元数据存储模块Metastore
1.元数据:描述数据的数据
- 描述HDFS文件和表的各种对应关系(位置关系、顺序关系、分隔符)
- 存储:在关系数据库中(Hive内置的是Derby、第三方的是MySQL),HDFS中存储的是数据
- 默认存储在Hive内置的Derby数据库中,但由于Derby只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL代替Derby
2.Metastore
-
Metastore是独立的关系数据库,可以是MySQL实例,也可是Hive自带的Derby实例,提供
元数据服务
-
Metastore保存表模式和其他系统元数据
- 表的名称
- 表的列及其属
- 表的分区及其属性
- 表的属性
- 表中数据所在位置信息等
-
Metastore对外提供一个服务地址,使客户端能够连接Hive,以此来对元数据进行访问
- 元数据把数据保存在关系数据库中,Hive提供元数据服务,通过对外的服务地址,用户能够使用客户端连接Hive,访问并操作元数据
- 支持多个客户端的连接,实现了数据访问层面的解耦操作
- Hive创建的表在presto/impala/sparksql中可直接使用(Metastore中获取统一的元数据信息)
3.Metastore管理元数据方式
-
内嵌:默认Metastore元数据服务和Hive服务融合在一起
- Hive服务(即Hive驱动本身)+ 元数据服务Metastore + 元数据metadata(用于存储映射信息)在一个JVM
- 启动HiveServer进程,Derby和Metastore都会启动
- 一次只能支持一个用户访问,适用于测试场景
-
本地:把元数据提取出来
- Metastore服务与HiveServer主进程在同一个JVM进程中运行,存储元数据的数据库在单独的进程中
- 元数据一般存储在MySQL关系型数据库
-
远程:都单独进程
- Metastore在单独进程运行,保证全局唯一,保证数据访问安全性(不随hive启动而动)
- 安装在远程服务器集群,解耦Hive服务和Metastore服务,保证Hive的稳定运行
2.4.4HQL的执行流程
- 语法解析:Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree;
- 语义解析:遍历AST Tree,抽象出查询的基本组成单元QueryBlock;
- 生成逻辑执行计划:遍历QueryBlock,翻译为执行操作树OperatorTree;
- 优化逻辑执行计划:逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;
- 生成物理执行计划:遍历OperatorTree,翻译为MapReduce任务;
- 优化物理执行计划:物理层优化器进行MapReduce任务的变换,生成最终的执行计划。
2.5实战应用
- Hive的安装部署和管理
- Hive常用的DDL操作
3参考
- https://shenhao-stu.github.io/Big-Data/#/
-
HiveQL编译过程
-
LanguageManual DDL