目录
-
hive简介
-
什么是hive
- Hive由Fackbook实现并开源
- 是基于Hadoop的数据仓库工具
- 可以将结构化的数据映射成一张数据库表
- 有HQL(hive的sql)查询
- 底层数据存储在hdfs上面
- 本质是将hql转换成MapReduce任务进行处理和计算Hdfs上面的结构化数据
- 适用于离线的批量数据计算(数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策)
- Hive依赖于HDFS存储数据,hive将HQL转换成MapReduce执行,所以说Hive是基于H到哦呸的一个数据仓库工具,实质上是一款基于HDFS的MapReduce计算框架,堆存处在HDFS中的数据进行分析和管理。
-
hive的优点
- 可扩展行,横向扩展
- 延展性
- 良好的容错性
-
hive的缺点
- hive不支持记录级别的增删改操作
- hive的查询延时比较严重
- hive不支持事务(主要用来做OLAP(练级分析处理),不能做OLTP(联机事务处理))
-
hive和RDBMS(关系型数据库)的对比
-
- hive是适合用来做海量离线数据的统计分析,也就是数据仓库。
-
Hive的架构
- 用户接口
- CLI:shell命令,使用hive命令行与hive进行交互
- JDBC/ODBC:是Hive基于JDBC操作提供的客户端
- Web UI:通过浏览器访问hive
- 跨语言服务
- Thrift Server:Thrift是Facebook开发的一个软件框架,能支持不同的变成语言调用hive的接口
- 底层的Driver
- Driver组件完成HQL查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在HDFS中,并随后由MapReduce调用执行
- hive的核心是驱动引擎,驱动引擎由四部分组成:
- 解释器:将HiveSQL语句转换为抽象语法数(AST)
- 编译器:将语法树编译为逻辑执行计划
- 优化器:对逻辑执行计划进行优化
- 执行器:调用底层的运行框架执行逻辑执行计划
- 元数据存储系统
- 元数据,就是存储在hive中的数据的描述信息
- 忽略中的元数据包括:表名、表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录
- Metastore默认存在自带的Derby数据库中。缺点就是不适合读用户操作,并且数据存储目录不固定。通常都是使用mysql库
- hive和mysql之间通过MetaStore服务进行交互
-
执行流程
- HQL通过命令行或者客户端提交,经过Compiler编译器,运用MetaStore中的元数据进行类型检测和语法分析,生成一个逻辑方案,然后通过优化处理,产生一个MapReduce任务。
-
Hive的数据组织
- hive的存储结构包括数据库、表、视图、分区和表数据等。数据库、表、分区等都对应HDFS上面的一个目录。表数据对应HDFS对应目录下的文件
- hive中所有的数据都存储在HDFS中,没有专门的数据存储格式;hive是读模式,可支持TextFile、SequenceFile、RCFile活自定义格式等
- 创建表的时候定义好列分隔符和行分隔符,hive就可以解析数据
- 默认列分隔符:Ctrl+A、\x01
- 默认的行分隔符:\n
- hive中包含以下数据模型
- database:在HDFS中表现为$(hive.metastore.warehouse.dir)目录下的一个文件夹
- table:在HDFS中表现所属database目录下的一个文件夹
- external table :与table类似,不过他的数据存放位置可以指定任意HDFS目录路径
- partition:在HDFS中表现为table目录下的子目录
- bucket:在HDFS中表现为同一表目录或者分区目录下根据某个字段的值进行hash散列之后的多个文件
- view:与传统数据库类似,只读,基于基本表创建
- hive的元数据存储在RDBMS中,除元数据外的其他所有数据都基于HDFS存储。默认情况下,hive元数据保存在内嵌的Derby数据库中,只能允许一个会话链接,只适合简单的测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL作为源数据库,hive内部对MySQL提供了很好的支持
- hive中的表分为内部表、外部表、分区表和Bucket表
- 内部表和外部表的区别
- 删除内部表,删除表的元数据和数据
- 删除外部表,删除元数据,不删除数据
- 内部表和外部表的使用选择
- 大多数情况下,他们的区别不明显,如果数据的所有处理都在hive中进行,那么倾向于选择内部表,但是如果hive和其他工具要针对相同的数据集进行处理,外部表更合适
- 使用外部表访问存储在HDFS上的初始数据,然后通过hive转换数据并存到内部表中
- 使用外部标的场景是针对一个数据据的多个不同的Schema
- 通过外部表和内部表的区别和使用选择的对比可以看出来,hive其实仅仅只是对存储在HDFS尚德数据提供了一种新的抽象。而不是管理存储在HDFS上的数据。所以不管创建内部表还是外部表,都可以对hive表的数据存储目录中的数据进行增删操作
- 分区表和分桶表的区别:
- hive数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为Buckets,分桶表的原理和MapReduce表城中的HashPartitioner的原理类似
- 分区和分桶都是细化数据管理,但是分区表是手动添加分区,由于hive是读模式,所以对添加分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行hash散列形成的多个文件,所以数据的准确性也高很多
- 内部表和外部表的区别
- 用户接口
-
-