美文网首页
HIVE基本原理及代码阅读指南(小白)

HIVE基本原理及代码阅读指南(小白)

作者: 太阳与冰_b431 | 来源:发表于2020-05-27 13:48 被阅读0次

HIVE基本工作原理

参考资料:from hive developerGuide    https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HiveSerDe

一个SQL完整的生命周期包括很多阶段,主要分为编译阶段、计算阶段、存储阶段。

编译阶段:一个sql提交过来,需要对这段sql进行语义分析、优化等处理过程,变成底层计算引擎(yarn的mr或者spark的dag)可以计算的任务;

计算阶段:sql这个时候已经变成mr task或者dag的task,计算引擎执行各个task任务的过程;

存储阶段:底层元数据应该怎么存储,一般metastore来做这件事;还有实际数据应该怎么存储更好,是直接存储成txt呢?还是使用自定义的列式存储方式呢?还是在存储的数据块中加入点索引呢?等等,存储方式的不同往往有时候是决定查询效率的;(好比一个字典带检索目录和不带检索目录,哪个查询快呢?)

存储阶段

what is a SerDa? org.apache.hadoop.hive.serde2类,hive里面集成的序列化和反序列化工具,用于读取底层的hdfs数据。

读的过程:HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object

写的过程:Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

使用fileformat类读取hdfs文件的几种方式:

TextInputFormat/HiveIgnoreKeyTextOutputFormat: These 2 classes read/write data in plain text file format.

SequenceFileInputFormat/SequenceFileOutputFormat: These 2 classes read/write data in Hadoop SequenceFile format.

使用SerDe类序列化及反序列化数据的方式:

MetadataTypedColumnsetSerDe: This SerDe is used to read/write delimited records like CSV, tab-separated control-A separated records (sorry, quote is not supported yet).

LazySimpleSerDe: This SerDe can be used to read the same data format as MetadataTypedColumnsetSerDe and TCTLSeparatedProtocol, however, it creates Objects in a lazy way which provides better performance. Starting inHive 0.14.0it also supports read/write data with a specified encode charset

Demo:下图为一张orc表的详细建表语句,从desc table的信息中可以看得出来序列化工具使用的是OrcSerde,fileformat使用的是OrcInputFormat和OrcOutputFormat,序列化的属性'serialization.format'='1'。

show create table orc_range_1

当然你也可以自己根据自己定义的数据格式弄个SerDe出来,比如星环的holodesk表,比如RegexDeserializer 会根据正则来解析数据,比如使用DynamicSerDe来自定义一个SerDe。

what is ObjectInspector?由上述描述可知hive内部的数据为row object,那么如何解析这个object呢。一个复杂的object可以由一个ObjectInspector和java object构成,引入这个ObjectInspector就是为了描述object的结构等信息。

如何创建一个自定义的表呢?

To add a new native SerDe with STORED AS keyword, follow these steps:

1、Create a storage format descriptor class extending fromAbstractStorageFormatDescriptor.java that returns a "stored as" keyword and the names of InputFormat, OutputFormat, and SerDe classes.

2、Add the name of the storage format descriptor class to theStorageFormatDescriptor registration file.

编译阶段

参考资料:https://www.slideshare.net/nzhang/hive-anatomy

关于一个sql如何变成一个执行计划的?what is metastore?

编译过程:HiveQL-(1)-> Abstract Syntax Tree(AST)-(2)->operator trees-(3)->operator trees-(4)->MR Tasks

(1):Parser (antlr)   (2):Logical Plan Generator (3):Optimizer (4):Physical Plan Generator

hive编译流程

整个流程就是先对sql做解析生成抽象语法树,之后在通过逻辑计划生成器生成逻辑计划,再通过优化器对逻辑计划进行优化,最后生成物理计划。

以上antlr是一个解析器,会生成一个抽象的语法树,实现方式参考类org.apache.hadoop.hive.ql.parse.ASTNode;

semantic analyzer是一个语法解析器,可识别一些ddl和dml相关的语法树,实现方式参考org.apache.hadoop.hive.ql.parse.SemanticAnalyzer。例如DDLSegmanticAnalyzer继承BaseSegmanticAnalyzer用来处理类似create table的语法;在查看这个类的继承类的时候需要进一步分析analyzeInternal()主方法,里面主要通过三种方法来生成逻辑计划doPhase1方法会递归遍历AST树,检查语法错误;getMetaData()收集元数据信息并put到QB和QBParseInfo中;genPlan()根据QB/QBParseInfo/ASTtree信息生成operator tree。

相关文章

网友评论

      本文标题:HIVE基本原理及代码阅读指南(小白)

      本文链接:https://www.haomeiwen.com/subject/plishqtx.html