hive基于Hadoop的一个数据仓库工具,将结构化的数据文件映射为一张数据库表,提供简单的sql查询功能,将sql语句转换为MapReduce任务进行运行,可通过类SQL语句HQL快速实现简单的MapReduce统计,十分适合数据仓库的统计分析;
Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询;
特点:
● 支持索引,优化数据查询。
● 不同的存储类型,例如:TextFile,SequenceFile,RCFile 或者自定义格式;
- 直接使用存储在Hadoop 文件系统中的数据,无专门存储格式,读模式
● 将元数据保存在关系数据库中,减少了在查询中语义检查的时间
● 内置用户函数UDF操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数。
内部架构
用户接口:
- CLI启动会启动hive副本,shell终端命令行
- client客户端,JDBC/ODBC用户连接至server,启动client模式时需指出hive serve所在节点,且在该节点启动Hive
- WUI浏览器访问Hive,浏览器
跨语言服务
- thrift server进行可扩展跨语言服务开发,不同语言调用hive接口
元数据存储
- 元数据(表名字,列和分区及其属性,表的属性/所在目录等数据描述信息)存RDBMS中,默认存内嵌的Derby数据库中,只容许一个会话连接,适合简单测试
- Metastore默认存在自带的Derby数据库中,缺点是不适合多用户操作,数据存储目录不固定
解决:存自己的mysql库中(Hive内部对Mysql支持),Hive和mysql通过metastore交互
解释器,编译器,优化器,执行器
- 解释器 : 将HiveSQL语句转换为抽象语法树
- 编译器:语法树编译为逻辑执行计划
- 优化器:对逻辑执行计划进行优化
- 执行器:执行器的调用底层运行框架执行逻辑执行计划
- 以上完成HQL查询语句从词法 语法分析、编译、优化及查询计划的生成
- 生成查询计划存在HDFS中,随后由MapReduce调用执行
hadoop
数据组织
- 存储结构包括库、表、视图、分区和表数据,表 分区等对应HDFS目录,表数据对应HDFS目录下文件
- 建表时指定列分隔符(默认的是Ctrl + A,\x01 Hive)、行分隔符(换行符\n),便可解析数据
数据模型
- database:为${hive.metastore.warehouse.dir}目录下一个文件夹
- 表:概念上类似数据库的表,表在hive有对应的目录 存储 数据,HDFS表现database下的文件夹
- 外部表:已经在HDFS的数据,可创建partition,和table在元数据的组织上相同,实际数据的存储较大差异
数据存放位置可指定任意HDFS目录路径
- 分区:对应数据库中partition列的密集索引,在hive中表中的partition对应表下的一个目录,all的partition数据都存储在目录中,table的子目录
- 桶:对指定列计算hash,据hash值切分数据;为了并行每个bucket对应一个文件
同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件
- 视图:传统数据库类似,只读,基于表创建
数据存储
非常自由组织表,创建时指定列行的分隔符
table的创建和数据的加载(一个语句中完成)
加载数据过程中实际数据被移动到数据仓库目录中,之后对数据访问直接在仓库中完成
删除表时,表中的数据和元数据一并删除
外部表
只有一个过程,加载数据和创建表同时完成,实际数据存在location后面指定的hdfs路径中,并不移动到仓库目录中,删除时仅删除元数据,表中数据不会正在删除
外部表访问HDFS上初识数据,通过Hive转换数据并存内部表中;
使用场景:针对一个数据集有多个不同的schema
如果数据all处理在hive中,倾向于选择内部表,如果Hive和其他工具要针对相同数据集处理,外部表适合
hive只对存在HDFS上的数据提供新的抽象,不管理其上的数据
执行流程
通过HiveQL通命令行或客户端提交,经Compiler编译器,运用MetaStore元数据类型检测和语法分析,生成逻辑方案,优化处理,产生MapReduce任务。
Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户;在加载数据过程中不会修改数据,只是将数据移动到HDFS 中Hive 设定的目录下,所有的数据都是在加载的时候确定的。
感谢百度https://baike.baidu.com/item/hive/67986?fr=aladdin#3