同样,本文也仅仅是个人笔记
前段时间在做与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的输出文件其实是空文件。