文章目录
介绍
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。hivecli已经过时,官方建议使用新的命令行工具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接口。
参考网址
apache-hive-architecture
Hive-Design
HiveClient
HCatlog简单介绍