1. Hive简介
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
2. hive与关系数据库的区别
- 存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
- hive使用的计算模型是mapreduce,而关系数据库则是自己设计的计算模型
- 关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差
- 对于更新操作,hive是通过查询将原表的数据进行转化最后存储在新表里,
- Hive很容易扩展自己的存储能力和计算能力
- hive不支持对某个具体行的操作,hive对数据的操作只支持覆盖原数据和追加数据。Hive也不支持事务和索引
3. hive的优缺点
优点
- 可扩展性
- 延展性,hive支持自定义函数,用户可以根据自己需求实现自己的函数
- 良好的容错性,可以保障即使有节点出现问题,sql语句仍然可以完成执行
缺点 - Hive因为调用了MapReduce,效率降低了
- Hive不支持事务
4. Hive架构
用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive
客户端组件
- CLI:command line interface,命令行接口
- Client :Hive的客户端
- Thrift客户端:hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口
- WEBGUI:hive客户端提供了一种通过网页的方式访问hive所提供的服务
服务端组件
- Driver组件:该组件包括Complier(编译器)、Optimizer(优化器)和Executor,(执行器)作用是完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
- Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql Hive和MySQL之间通过MetaStore服务交互
执行流程:HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数 据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生 一个 MapReduce 任务。 - Thrift服务:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
hive的数据组织
- hive的存储结构包括数据库、表、视图、分区和表数据等,数据库,表,分区等等都对应HDFS上的一个目录,表数据对应hdfs对应目录下的文件。
- Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,因为Hive是读模式,可支持TextFile,SquenceFile,RCFile或者自定义格式等
- 只需要在创建表的的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据
Hive 的默认列分隔符:控制符 Ctrl + A,\x01 Hive 的
Hive 的默认行分隔符:换行符 \n - Hive中包含以下数据模型
- database:在HDFS中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
- table:在HDFS中表现所属database目录下一个文件夹
- external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径
- partition:在 HDFS 中表现为 table 目录下的子目录
- bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件
- view:与传统数据库类似,只读,基于基本表创建
hive的常见表
Hive 中的表分为内部表、外部表、分区表和 Bucket 表
hive的内部表和外部表的区别
hive默认创建的是内部表
- 删除内部表,删除表元数据和数据
- 删除外部表,删除元数据,不删除数据
- 内部表数据由Hive自身管理,外部表数据由HDFS管理;
- 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
hive内部表和外部表的使用选择
如果数据的所有处理都在 Hive 中进行,那么倾向于 选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。 使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中