Hive架构与源码分析(整理版)
1. Hive的架构
  Hive的体系结构可以分为以下⼏部分:
1. ⽤户接⼝主要有三个:CLI,JDBC/ODBC和 Web UI。
1. ①其中,最常⽤的是CLI,即Shell命令⾏;
2. ②JDBC/ODBC Client是Hive的Java客户端,与使⽤传统数据库JDBC的⽅式类似,⽤户需要连接⾄Hive Server;
3. ③Web UI是通过浏览器访问。
2. Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表
等),表的数据所在⽬录等。
3. 解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的⽣成。⽣成的查询计划存储在HDFS
中,并在随后有MapReduce调⽤ 执⾏。
4. Hive的数据存储在HDFS中,⼤部分的查询、计算由MapReduce完成(包含*的查询,⽐如select * from tbl不会⽣成MapReduce任
务)
2. Hive的元数据存储
  对于数据存储,Hive没有专门的数据存储格式,也没有为数据建⽴索引,⽤户可以⾮常⾃由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和⾏分隔符,Hive就可以解析数据。Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、⽂件、表和视图。Hive中包含以下数据模型:Table内部表,External Table外部表,Partition分区,Bucket桶。Hive默认可以直接加载⽂本⽂件,还⽀持sequence file、RCFile。
  Hive将元数据存储在RDBMS中,有三种模式可以连接到数据库:
2.1 元数据内嵌模式(Embedded Metastore Database)
  此模式连接到⼀个本地内嵌In-memory的数据库Derby,⼀般⽤于Unit Test,内嵌的derby数据库每次只能访问⼀个数据⽂件,也就意味着它不⽀持多会话连接。
参数描述⽤例
javax.jdo.option.ConnectionURL  JDBC连接url jdbc:derby:databaseName=metastore_db;create=true
javax.jdo.option.ConnectionDriverName JDBC driver名称 org.apache.derby.jdbc.EmbeddedDriver
javax.jdo.option.ConnectionUserName ⽤户名 xxx
javax.jdo.option.ConnectionPassword 密码 xxxx
2.2 本地元数据存储模式(Local Metastore Server)
  通过⽹络连接到⼀个数据库中,是最经常使⽤到的模式。
参数描述⽤例
javax.jdo.option.ConnectionURL JDBC连接url jdbc:mysql://<host name>/databaseName?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName JDBC driver名称sql.jdbc.Driver
javax.jdo.option.ConnectionUserName⽤户名xxx
javax.jdo.option.ConnectionPassword密码xxxx
2.3 远程访问元数据模式(Remote Metastore Server)
  ⽤于⾮Java客户端访问元数据库,在服务端启动MetaServer,客户端利⽤Thrift协议通过MetaStoreServer访问元数据库。
服务端启动HiveMetaStore
  第⼀种⽅式:
hive --service metastore -p 9083 &
  第⼆种⽅式:
  如果在l⾥指定了astore.uris的port,就可以不指定端⼝启动了
<property>
<name&astore.uris</name>
<value>thrift://hadoop003:9083</value>
</property>
hive --service metastore
客户端配置
参数描述⽤例
2.4 三种模式汇总
3. Hive⼯作原理
3.1 Hive内部组件分布构成
                 No. 1 Hive全局架构图
 从图1 Hive全局架构图中可以看到Hive架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、Hive WEB Interface(HWI)、metastore和Driver(Compiler、Optimizer)
  Metastore组件:元数据服务组件,这个组件⽤于存储hive的元数据,包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在⽬录等内容。hive的元数据存储在关系数据库⾥,⽀持derby、mysql两种关系型数据库。元数据对于hive⼗分重要,因此hive⽀持把metastore服务独⽴出来,安装到远程的服务器集⾥,从⽽解耦hive服务和metastore服务,保证hive运⾏的健壮性。
  Driver组件:该组件包括Parser、Compiler、Optimizer和Executor,它的作⽤是将我们写的HiveQL(类SQL)语句进⾏解析、编译、优化,⽣成执⾏计划,然后调⽤底层的mapreduce计算框架。
解释器(Parser):将SQL字符串转化为抽象语法树AST;
编译器(Compiler):将AST编译成逻辑执⾏计划;
优化器(Optimizer):对逻辑执⾏计划进⾏优化;
执⾏器(Executor):将逻辑执⾏计划转成可执⾏的物理计划,如MR/Spark
  CLI:command line interface,命令⾏接⼝
  ThriftServers:提供JDBC和ODBC接⼊的能⼒,它⽤来进⾏可扩展且跨语⾔的服务的开发,hive集成了该服务,能让不同的编程语⾔调⽤hive的接⼝。
3.2 Hive详细运⾏架构
                                 No.2  Hive运⾏详细架构图
 ⼯作流程步骤:
1. ExecuteQuery(执⾏查询操作):命令⾏或Web UI之类的Hive接⼝将查询发送给Driver(任何数据驱动程序,如JDBC、ODBC等)执
⾏;
2. GetPlan(获取计划任务):Driver借助编译器解析查询,检查语法和查询计划或查询需求;
3. GetMetaData(获取元数据信息):编译器将元数据请求发送到Metastore(任何数据库);
4. SendMetaData(发送元数据):MetaStore将元数据作为对编译器的响应发送出去;
5. SendPlan(发送计划任务):编译器检查需求并将计划重新发送给Driver。到⽬前为⽌,查询的解析和编译已经完成;
thrift6. ExecutePlan(执⾏计划任务):Driver将执⾏计划发送到执⾏引擎;
6.1 ExecuteJob(执⾏Job任务):在内部,执⾏任务的过程是MapReduce Job。执⾏引擎将Job发送到
ResourceManager,ResourceManager位于Name节点中,并将job分配给datanode中的NodeManage
r。在这⾥,查询执⾏MapReduce任务;
6.1 Metadata Ops(元数据操作):在执⾏的同时,执⾏引擎可以使⽤Metastore执⾏元数据操作;
6.2 jobDone(完成任务):完成MapReduce Job;
6.3 dfs operations(dfs操作记录):向namenode获取操作数据;
7. FetchResult(拉取结果集):执⾏引擎将从datanode上获取结果集;
8. SendResults(发送结果集⾄driver):执⾏引擎将这些结果值发送给Driver;
9. SendResults (driver将result发送⾄interface):Driver将结果发送到Hive接⼝(即UI);
3.3 Driver端的Hive编译流程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。