hive 源码结构分析(编译器)
????? Hive是将SQL语句转换成hadoop的MapReduce程序,通常在客户端执行hive命令,然后输入SQL语句后,hive将SQL语句生成多个MR的job,然后将这些job提交给hadoop进行执行,完成后,再把结果放入到hdfs或者本地的临时文件中。Hive中的表结构信息都是保存在关系型数据库中,如mysql,derby等,可以通过hive-site.xml中配置数据库的URL,用户名,密码等。而表的实际数据内容保存在hadoop的hdfs文件中,行和列数据分别用特殊字符串分格开,以便能够读取数据,默认是用ctrl+a和\n来分隔。
?????? 客户/服务器通信:由org.apache.hadoop.hive.ql包中的Driver类来完成,该类主要有一个run(command)方法,而该方法主要有二个方法组成:
int ret = compile(command);此方法主要完成语法,语义,计划生成。
ret = execute();执行物理计划,即提交相应的job给hadoop进行执行。
执行完成后,会将执行结果通过CommandProcessorResponse类包装返回给客户端。
另外,在hive中,提供本地直接运行hive命令,也提交了jdbc访问。具体实现分别在对应的包里。
?????? 语法分析器:将sql语句转换成一颗语法树,像编译原理书上讲的,其实就是一个普通树,只不过这颗保存了sql语句的结构,而hive是用anltr自动生成的语法树。分别由org.apache.hadoop.hive.ql.parse包中的HiveLexer和HiveParser完成词法和语法分析工作。
?????? 语义分析:根据不同的类型的语句生成不同的语法,所以有个抽象语义分析类BaseSemanticAnalyzer,分别有以下子类,对应于不同类型的语句:
ExplainSemanticAnalyzer
ExplainSemanticAnalyzer
LoadSemanticAnalyzer
DDLSemanticAnalyzer
FunctionSemanticAnalyzer
SemanticAnalyzer
?????? 语义分析完成后,会将语句中的相应信息放入到org.apache.hadoop.hive.ql.plan包中*Desc类中,这些类记录了相应语句的基本信息。
?????? 然后会对语义完了的信息进行验证,比如表是否存在,字段是否存在,这时需要查询元数据,同时将表的相关信息放到desc对象中。
逻辑计划生成器:根据语义分析后的相关信息,将生成出逻辑操作树,抽象类为Operator。子类有:
ExtractOperator
FilterOperator
ForwardOperator
GroupbyOperator
LateralViewJoinOperator
LimitOperator
MapOperator
ScriptOperator
SelectOperator
TableScanOperator
TerminalOperator-Base Class
FileSinkOperator
ReduceSinkOperator
UDTFOperator
UnionOperator
计划优化器:将操作树进行一些优化,主要是基于规则的优化。这部分,这次我略过了,下次再讲解。
物理计划生成器:根据逻辑操作树生成出物理计划树,这个物理计划是由Task对象来包装的,而Task类会有一个Work对象,Work类是物理计划的描述,当task对象执行时,通常需要用到work对象上的相关信息。
Work子类有:
FetchWork?
MoveWork
MapredWork
CopyWork
DDLWork
FunctionWork
ExplainWork
ConditionalWork
物理计划执行器:就是将一颗含有Task类对象的树,进行从上到下执行。分别调用该对象的execute()方法,而该方法会完成相应的物理计划执行工作。主要有:
FetchTask
ConditionalTask
CopyTask
DDLTask
ExplainTask
MapRedTask
MoveTask
每个类都表示一种物理计划。如FetchTask就是从hdfs或者本地文件中取出表或视图的记录。
?????? 总结,Hive跟大多数的关系数据库类似的,有相同的步骤来完成从语句到最后物理执行。不同的是Hive的执行是在hadoop的MR程序来执行。同时在这个过程中的,操作类,计划类都是由Java对象来包装起来,且可以序列化的,相信其他数据库的计划也是某种语言的对象来保存的。
?
1 楼 fuyanqing03 2011-12-01 请教一个问题,当我执行下面这个HQL: