笔记:Hive交互的过程简述

同样,本文也仅仅是个人笔记

前段时间在做与Hive相关的工作,于是简单整理一下Hive交互的过程吧。

 

一、解析部分

1.系统建立jvm,利用反射机制运行Hive

2.CliDriver.main 解析cmdline的主程序,将有‘;'的输入分割组合成一句完整的sql

3.CliDriver.processLine 分析运行一句sql

4.CliDriver.processCmd

5.compile 判断合法性,并且生成一个ASTNode对象以及一个QueryPlan对象

6.利用SematicAnalyzer,从plan对象中获取语法分析结果,并且将其一个一个put入runnableTask的队列中

7.从队列中取材队头,执行task.execute

二、运行部分

执行Map/Reduce作业,略过

三、取得执行结果

1.在CliDriver中调用跑完Map/Reduce后,利用Driver.getResult获取

2.顺序打开每个输出文件

3.使用Fetchtask.fetch()获得,实际上是调用FetchOperator.getNextRow,打开Reader,获取每一行的输出

4.将所有的输出组合,打印到控制台

四、结束清理

1.删除hive.exec.plan下的文件

2.删除hive.exec.scratchdir下的文件

3.实际上,在对目录进行删除时,先删除所有的子文件,然后对EditLog进行同步操作,最后删除目录

 

从整个流程来看,存在一个问题:若一个Hive语句写的不好,有可能出现非常多的map而没有reduce,因此输出文件将非常多,fetch输出结果需要顺序读取多个文件,造成大量的文件打开、读、关闭操作,将变得十分耗时,对于用户而言,有可能在控制台看到Map/Reduce100%结束,但还需要等待一段时间,才能获得sql语句的结果,而结果的条数有可能很少,因为很多map的输出文件其实是空文件。

你可能感兴趣的:(jvm,sql,工作)