HIVE Tutorial
文章目录
介绍
Hive是开源的数据仓库工具,用于执行分布式处理和数据分析的。由Facebook
开发来解决替代JAVA MR
程序的。
Hive使用HQL
(Hive Query language),这是一种类似sql的声明式语言。Hive将hive query
转换成MR程序。
Hive支持开发者使用hive query
来代替写复杂的JAVA MR
程序来对结构化和半结构化的数据做处理和分析。
熟悉sql的人就非常容易地写出hive query
。
Hive Architechture
上面的图就展示了Hive的架构及它主要的组件。
Hive主要的组件有 Hive Client
、Hive Services
、Processing and Resource Management
和Distributed Storage
Hive Client
Hive支持其他语言如Python, Java, C++, Ruby等来使用JDBC, ODBC, and Thrift
写application在hive上执行。
-
Thrift Clients
由于Hiveserver2
本身就是用Thrift
来实现的,所以能处理来自于thrift client的请求。 -
JDBC client
Hive允许Java applications
使用JDBC driver
来连接Hive。JDBC driver
也是通过Thrift
来和Hiveserver2
通信的。 -
ODBC client
Hive ODBC driver
允许基于ODBC
协议的应用来连接Hive。类似于JDBC driver
,ODBCdriver
也是通过Thrift
来和Hiveserver2
通信的。 -
Command Line
有hive
和beeline
两个命令行,既可以进行交互式操作也可以进行批量sql执行操作。从Hive 0.11
版本引入Hiveserver2
后,Hiveserver2
有自己的一套Command Line即beeline
,beeline
其实是基于SQLLine
的JDBC client
。hive
cli已经过时,官方建议使用新的命令行工具beeline
。更加详细的beeline
操作可以参考官网NewCommandLineShell。
Hive Service
-
Beeline
这个在上面的Command Line已经提到了,其实是Hiveserver2
提供的一套新的Command Line,还是属于Hiveserver2
。 -
Hiveserver2
HiveServer2
是HiveServer1
的下一个版本。HiveServer2
能够让client在hive上执行查询,允许多个client去向hive提交请求并检索最后的查询结果。它是被设计成为为通用的API如JDBC and ODBC
提供最好的支持。
注意:HiveServer1
也叫做Thrift server
,是基于Apache Thrift protocol
来跨平台和hive进行交互的,一样地允许不同的client去向hive提交请求并检索最后的查询结果。但是HiveServer1
并不能处理来自多个客户端的并发请求,所以HiveServer1
就被新版本HiveServer2
替代了。 -
Hive Driver
Hive Driver
接受用户提交的HiveQL
语句(如通过命令行提交)。它创建一个session
来处理这个query
并将该query
发送给compiler
。 -
Hive Compiler
Hive compiler
解析这个query
。它通过使用存储在metastore
上的metadata信息对不同的query blocks
和query expressions
来做语义分析和类型检查,并生成一个执行计划(execution plan
)。Hive compiler
创建的执行计划是DAG(有向无环图),其中每个阶段都是map/reduce作业、HDFS上的操作、元数据操作。 -
Optimizer
Optimizer
在执行计划上做transformation
操作如将多个Join合并成一个join来提高性能,并split task
来提高效率和伸缩性。 -
Execution Engine
Execution Engine
在Hive compiler
和Optimizer
步骤后,按照其依赖关系(stage之间有依赖关系)使用Hadoop执行编译器创建的执行计划。 -
Metastore
Metastore
是一个中央存储库,它存储关于表和分区结构的元数据信息,包括列和列类型信息。
它还存储了读/写操作所需的serializer
和deserializer
的信息,以及存储数据的HDFS文件地址。这个Metastore
通常是一个关系数据库如mysql。Metastore
为查询和操作hive metadata提供了一个thrift接口。
由于自带的metastore是derby数据库,仅够学习用,一般生产环境还是会用mysql做metastore。
可以参考hive安装来将metastore换成mysql。 -
HCatalog
HCatalog
是Hadoop的表和存储管理层。它使用户可以使用不同的数据处理工具(如Pig、MapReduce等)轻松地在网格上读写数据。更加通俗地说,HCatalog
提供了一个统一的元数据服务,允许不同的工具如 Pig、MapReduce 等通过HCatalog
直接访问存储在 HDFS 上的底层文件。它建立在Hive metastore的基础上即使用了 Hive 的元数据存储,将Hive metastore的表格数据暴露给其他数据处理工具,这样就使得像 MapReduce 这样的第三方应用可以直接从 Hive 的数据仓库中读写数据。
HCatalog
是 Apache 的顶级项目,从 Hive0.11.0 开始,HCatalog 已经合并到 Hive 中。也就是说,如果是通过 binary 安装的 Hive0.11.0 之后的版本,HCatalog
已经自动安装了,不需要再单独部署。 -
WebHCat
WebHCat
就是HCatalog
的REST API
,是一个执行Hive metadata操作的HTTP
接口。它为用户提供了运行MR、PIG、Hive作业的服务。
Processing Framework and Resource Management
Hive默认使用MapReduce框架作为执行引擎。也可以使用hive on tez
或者hive on spark
。
Distributed Storage
Hive建立在Hadoop之上,所以它使用底层的HDFS作为分布式存储。
Hive的运行流程
-
executeQuery:
用户接口调用driver的执行接口,即传递HQL语句给driver。 -
getPlan:
driver
接收到query
,为该query
创建一个session来处理,然后传递该query
给compiler
用于生成执行计划(execution plan
)。 -
getMetaData
compiler
向metastore
发送获取metadata信息的请求。 -
sendMetaData
metastore
将metadata信息发送给compiler
。compiler
用接收到的metadata信息对查询树(query tree
)上的表达式(expressions
)做类型检查(type-checking
)和语义分析(semantic analysis
)。然后compiler
生成执行计划(execution plan
)即DAG
有向无环图。对于MapReduce job,该执行计划包括map operator trees
(操作在mapper阶段执行)和reduce operator tree
(操作在reducer阶段执行)。 -
sendPlan
compiler
将生成的执行计划发送给driver
。 -
executePlan
在接收到compiler
发送的执行计划后,driver
将执行计划发送给执行引擎(execution engine
)来执行这个计划。 -
submit job to MapReduce
执行引擎然后把DAG的各个stage发送给合适的组件。对于每个task,不管是mapper还是reducer,都会使用与表或者中间输出相关的deserializer
来从HDFS文件上读取row数据。然后数据会通过关联的操作树传递下去。一旦输出内容生成了,它就会通过
serializer
被写到HDFS的临时文件。这些临时的HDFS文件会给执行计划的下一个MapReduce stage提供数据。
对于DML操作,最后的临时文件会移动到表的location
。 -
sendResult ---- 也包括9,10步骤
对于查询,当driver
执行获取数据的操作时,执行引擎直接读取HDFS的临时文件的内容作为其数据的一部分。driver
然后将结果返回给Hive接口。