一上图肯定会很晕,所以先把流程顺一遍看图就会清晰很多.
流程
-
客户端提交Hql语句任务给Driver
-
Driver会创建一个session handler用于查询操作,接着dirver会将查询操作发送到compiler生成一个execute plan
-
Compiler通过对Hql词法,语法分析得到要操作的表,然后到MetaStore中获取需要的Hive元数据信息。
-
Compiler得到元数据信息,对task进行编译,先将Hql转换为抽象语法树,然后将抽象语法树转换成查询块,再将查询块转化为逻辑的查询plan,重写逻辑查询plan,再把逻辑plan转化为物理的plan.
-
最后选择最佳plan提交给Driver。
-
Driver则将plan转交给ExecutionEngine去执行.
执行器收到方案后,会进行判断:
6.1 如果当前方案不涉及到MR组件,比如为表添加分区信息、简单的查询操作 等,此时就会直接和元数据库交互,然后去HDFS上去找具体数据.
6.1 如果方案需要转换成MR任务,则会将job 提交给Hadoop的JobTracker或者 RsourceManager执行.
6.2 执行完成
6.3 执行器会和HDFS交互,获取结果文件信息
-
并返回执行结果.(如果客户端提交Hql语句是带有查询结果性的话,则会发生:7→8→9,最后完成结果的查询)