大数据 003hive概念原理
技术背景
- 因为mapreduce继承类和重写方法的固定化,导致编程代码模板化而且非常繁琐,
- 学习成本比较高,而且不适合复杂的分析场景
- 适合程序开发人员却不适合数据分析人员的使用
设计目的
- 帮助开发者解决使用类sql语句来操作hadoop
- hive是为了解决使用相对简单的sql语句替代复杂的mapreduce编程的实现
- 用来做离线分析,比直接用mapreduce开发效率更高
设计思想
- 通过将hdfs上的文件映射成表来实现hadoop的存储功能
- 解释:
- hive的存储实际上还是使用的hdfs存储,只是hive管理了逻辑表与实体文件的映射关系
- sql操作的对象是逻辑表
- 解释:
- 通过将sql语句转换成mapreduce的代码来实现hadoop的计算功能
技术本质
- 将hdfs上的结构化数据文件映射成一张数据库表来实现存储;
- 将类sql语句底层转换成mapreduce语句来实现计算
- hive其实就是一个可以使用sql来操作hadoop的客户端
核心特性
- 存储:hive可以将hdfs上的文件映射成表的数据,就是可以构建数据仓库,这个特性是目前使用的主要功能
- 计算:hive的计算是将底层转换成mapreduce程序进行的,mapreduce因为太死板,性能太差,所以计算这部分功能逐渐被presto,impala,sparkSql,flink等替代
角色概念
Client
意义: 通过hive提供的用户接口来链接hive服务,例如cli,JDBC/ODBC,webGUI
种类:
-
Hive Client:需要先启动metastore服务,然后直接使用bin/hive链接
- hive会去链接metastore服务,metastore服务再直接链接mysql
- 不推荐使用Hive Client,数据显示不美观
- 可以执行sql文件,非交互式客户端
-
Beeline Client : 需要先启动metastore服务,然后再启动hiveServer2服务,再使用bin/beeline链接
- beeline会去链接hiveserver2服务,hiveserver2服务然后会去链接metastore服务,metastore服务 再直接链接mysql
- 推荐使用此种方式,数据美观,还可以远程访问
- 不可以执行sql文件,交互式客户端
数据模型
- 目录结构:${hive.metastore.warehouse.dir}/xxx.db/table/partition/bucket_0
- db: 一个以.db后缀名结尾的文件夹,类似于数据库
- table: 所属db文件夹下的一个文件夹,类似于表
- external table: 类似于表,但是区别于admin table,它的数据存放位置可以通过location 任意指定位置
- partition: 分区,hdfs表现为table文件下的一个子目录,每个分区一个同级目录
- bucket: 分桶(分簇),表现为将同一个表目录根据hash散列之后的多个文件
元数据及管理
-
概念: 一种记录数仓中模型的定义,各层级的映射关系,监控数据状态,etl任务运行的状态的一种数据
-
意义: 用来设计,部署,操作和管理 数据仓库;元数据把数据仓库中的各个松散的组件联系起来,组成一个有机的整体
-
特点:
-
分类:
1.技术元数据:给it人员服务;描述了数据仓库的开发,管理和维护相关的数据;例如:数据源,数据转换,数仓模型,数据清洗和更新规则
2.业务元数据:给业务分析或管理层服务;描述数仓中具体有哪些数据,数据的位置及可用性等
例如:业务对象是文件,业务元数据就是描述文件的数据,比如这个文件多大,名称,类型等
元数据服务
三种配置方式:
内嵌的:使用derby文本数据库来管理,不需要单独启动metastore服务
缺点:
- 只支持单用户,
- 每个启动hive的客户端都拥有自己的一套元数据,无法共享,
- 使用hive进程中的metastore服务,每次启动一个hive进程,内置启动一个metastore服务
本地的:使用mysql数据库,不需要单独启动metastore服务
缺点:
- 只支持单一客户端
- 每次连接都需要发送用户名和密码,不安全
- 使用hive进程中的metastore服务,每次启动一个hive进程,就会启动一个metastore服务
远程的:使用mysql数据库,需要单独启动metastore服务,该模式下hive和metastore运行在不同的进程里
缺点:
- 需要单独启动metasotre服务
意义:
- 通过单独启动的metastore来达到客户端连接hive的解耦合功能,各种客户端只需要连接metastore服务,再由metastore服务连接mysql数据库来存取元数据,同时解决了方式1和方式2的缺点,
- 解耦
- 统一访问入口