Hive概述
Hive简介
Apache Hive数据仓库软件方便了使用SQL读取、写入和管理驻留在分布式存储中的大型数据集。结构可以投影到已经存储的数据上。提供命令行工具和JDBC驱动程序将用户连接到Hive。Hive的官网地址:hive.apache.org/,Hive产生后方便了…
hive产生的原因
- 方便对文件及数据的元数据进行管理,提供统一的元数据管理方式
- 提供更加简单的方式来访问大规模的数据集,使用SQL语言进行数据分析
| 对比项 | Hive | 关系型数据库 |
|---|---|---|
| 查询语音 | HQL | SQL |
| 数据存储 | HDFS | Local FS or RawDevice |
| 执行器 | MapReducer | Executor |
| 数据insert | 支持批量导入和单条插入 | 支持批量导入和单条插入 |
| 数据update和delete | 支持追加,不支持删除 | 行级别更新和删除 |
| 数据规模 | 大 | 小 |
| 执行延迟 | 高 | 低 |
| 分区 | 支持 | 支持 |
| 索引 | v0.8后支持 | 支持 |
| 数据加载模式 | 读时模式(快) | 写时模式(慢)age int |
| 扩展性 | 高 | 低 |
| 应用场景 | 海量数据查询 | 实时查询 |
Hive架构
- 用户接口主要有三个:CLI,JDBC/ODBC和 WebUI。其中最常用的是CLI,CLI启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。WebUI是通过浏览器访问Hive
- Hive将元数据存储在数据库中,如mysql、derby(hive自带的内存数据库)。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等
- 解释器(SQL Parser)、编译器(Compiler)、优化器(Optimizer)完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由执行器(Executor)调用MapReduce执行
- Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)
Hive经常被大数据企业用作企业级数据仓库。Hive在使用过程中是使用SQL语句来进行数据分析,由SQL语句到具体的任务执行还需要经过解释器,编译器,优化器,执行器四部分才能完成
-
解释器,调用语法解释器和语义分析器将SQL语句转换成对应的可执行的java代码或者业务代码
-
编译器,将对应的java代码转换成字节码文件或者jar包
-
优化器,从SQL语句到java代码的解析转化过程中需要调用优化器,进行相关策略的优化,实现最优的查询性能
-
执行器,当业务代码转换完成之后,需要上传到MapReduce的集群中执行
Hive的服务(角色)
- 用户访问接口 CLI(Command Line Interface): 用户可以使用Hive自带的命令行接口执行Hive SQL、设置参数等功能 JDBC/ODBC: 用户可以使用JDBC或者ODBC的方式在代码中操作Hive Web GUI: 浏览器接口,用户可以在浏览器中对Hive进行操作(2.2之后淘汰)
- Thrift Server: Thrift服务运行客户端,使用Java、C++、Ruby等多种语言,通过编程的方式远程访问Hive
- Hive Driver: Driver是Hive的核心,其中包含解释器、编译器、优化器等各个组件,完成从SQL语句到MapReduce任务的解析优化执行过程
- metastore: Hive的元数据存储服务,一般将数据存储在关系型数据库中,为了实现Hive元数据的持久化操作,Hive的安装包中自带了Derby内存数据库,但是在实际的生产环境中一般使用mysql来存储元数据
Hive 底层原理
每次执行SQL都叫做一个操作Operator,这些操作底层会转换成各种操作,例如扫描、查询、范围查询、格式输出等。Compiler编译器将一个Hive SQL转换成操作符,操作符是Hive的最小的处理单元,每个操作符代表HDFS的一个操作或者一道MapReduce作业。Hive通过ANTLR词法语法分析工具解析hql,将HQL转换成一个个的MR job执行