一、简单说一下hive架构里面包含哪些组件?
答:1、用户接口:Client
CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)
2、元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。
3、驱动器 :Driver
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark.
元数据:我们会把元数据配到MySQL里,即就是说让MySQL来帮我们存储这个元数据。HDFS上有一个文件,都是split,我可以在hive里建一张表,也就相当于做了个映射,HDFS的文件与hive表的映射。这个映射关系就是我们的元数据。
我们写个HQL,最终都要翻译成mapreduce,还是其他的也好,最终都要去HDFS上读数据。那它要去HDFS上哪个路径去读呢,hive就要先去MySQL里面访问下元数据,元数据里有我当前创建的这张表,在哪个路径上面。然后再去HDFS上拿数据。那么访问HDFS也那么一个步骤:找namenode,然后根据namenode返回的datanode去读(HDFS的读写原理)
总结:先去MySQL/Oracle/derby当中加载到元数据,元数据拼接起来路径,然后去HDFS上访问实际的数据(Hive不但连实际数据不自己存,连元数据都是别人存的,当然元数据不仅仅只存路径,还存了其他的东西)
二、hive执行过程
执行顺序:SQL解析器->编译器->优化器->执行器