普开数据大数据培训课程讲解:HIVE执行过程.pptx

上传人:tian****1990 文档编号:11538437 上传时间:2020-04-27 格式:PPTX 页数:35 大小:445KB
返回 下载 相关 举报
普开数据大数据培训课程讲解:HIVE执行过程.pptx_第1页
第1页 / 共35页
普开数据大数据培训课程讲解:HIVE执行过程.pptx_第2页
第2页 / 共35页
普开数据大数据培训课程讲解:HIVE执行过程.pptx_第3页
第3页 / 共35页
点击查看更多>>
资源描述
HIVE执行过程,普开数据大数据培训课程讲解:HIVE执行过程,Hive的执行过程,1.入口/bin/cli.sh调用CliDriver类进行初始化过程处理-e,-f,-h等信息,如果是-h,打印提示信息,并退出读取hive的配置文件,设置HiveConf创建一个控制台,进入交互模式2.在交互方式下,读取每一个输命令行,直到;为止,然后提交给processLine(cmd)方法处理,该方法将输入的流以;分割成多个命令,然后交给processCmd(cmd)方法,Hive的执行过程,3.ProcessCmd(cmd)对输入的命令行进行判断,根据命令的第一个记号(Token),分别进入相应的流程quitorexit系统正常退出!开头的命令行执行操作系统命令source开头的,读取外部文件并执行文件中的命令list列出jarfilearchive其他命令提交给Commandprocess,进行命令的预处理,Hive的执行过程,4.命令的预处理CommandProcess根据输入命令的第一个记号,分别进行处理set:调用SetProcess类,设置hive的环境参数,并保存在该进程的HiveConf中dfs:调用DfsProcess类,调用hadoop的shell接口,执行hadoop的相关命令add:调用AddResourceProcessor,导入外部的资源,只对该进程有效delete:与add对应,删除资源其他:提交给Driver类,进行下一步的处理,Hive的执行过程,5.命令的处理(Driver类的run方法)编译complie(Hive的核心部分)通过语言识别工具Antlr,验证语句的合法性将sql转换成一个抽象语法树(AST)定义树解释器Operator,将AST翻译成逻辑操作树调用genMapRed方法,生成物理执行计划获取读写锁对操作的表获取一个读写锁acquireReadWriteLocks执行execute将生成的Task提交hadoopAPI处理返回任务的执行时间和状态(成功失败),Hive的执行过程,6.获取执行的结果任务执行失败,抛出异常执行成功后,调用Driver的GetReuslt方法,顺序打开每一个输出文件获取每一行的输出,并打印到控制台7.执行清理清理hive执行过程中的中间文件和临时文件退出该条命令的执行,返回控制台并等待下一条命令的输入,Hive的执行过程,4.run(cmd)的执行过程Complie:Execute:,Hive的执行过程(示意图),Antlr(ANotherToolforLanguageRecognition)又一个语言识别工具Antlr提供了一种语言工具框架定义标示符,关键字(词法分析)定义表达式(语法分析)可以将文本转换成抽象语法树(AST)树的解析(树分析器),Antlr简介,词法分析识别的是字符流通过词法规则,依次读入字符,并转换成记号(Token)例如,select-select关键字的过程就是一个词法分析的过程词法分析过程是一个ASCII分类整理的过程,哪些地方可以跳过(空格、换行、注释),哪些记号属于标识符,哪些记号属于字符串、整数、浮点数等。词法部分的定义以大写字母开头,词法分析器Lexer,常见的词法定义INT:(0.9)+/定义一个正整数FLOAT:INT(.INT)/定义一个浮点数CHAR:(A.Z|a.z)/定义一个字符String:”(CHAR+)”/定义一个字符串WS:(|t|n|r)+skip();/定义一个可以忽略的字符COMMENT:/*.*/定义一个多行注释LINE_COMMENT:/(n|r)*r?n/定义一个单行注释,词法分析器Lexer,根据词法分析输出的记号流,分析语法结构,并添加代表语法结构的抽象单词(如:表达式、类、方法等),按照语法结构生成语法树的过程语法分析定义了输入字符串的合法性语法分析将词与词之间的关系用一个语法树表达出来语法部分的定义由小写字母开头、语法分析可以生成抽象语法树(AST),语法分析器(Parser),语法分析器举例:prog:expr/语法解释的入口expr:multExpr(+|-)multExpr)*;/定义加减的规则multExpr:atom(*|/)atom)*;/乘除法的规则atom:(expr)|INT|FLOAT;/终结的节点,语法分析器(Parser),在语法定义中直接定义动作exprreturnsintvalue:e=multExpr$value=$e.value;(+e=multExpr$value+=$e.value;|-e=multExpr$value-=$e.value;)*;multExprreturnsintvalue:e=atom$value=$e.value;(*e=atom$value*=$e.value;)*;atomreturnsintvalue:INT$value=Integer.parseInt($INT.text);,嵌入式动作,抽象语法树表达token之间关系的(根节点与叶子节点)prog:expr/语法解释的入口expr:multExpr(+|-)multExpr)*;/定义表达式的规则multExpr:atom(*|/)atom)*;/乘除法的规则atom:(expr)|INT|FLOAT;/终结的节点,语法分析器(Parser),对AST的分析,不同的节点记号,进行不同的动作,如exprreturnsIntegervalue:(+e1=expre2=expr)$value=e1.value+e2.value;|(-e1=expre2=expr)$value=e1.value-e2.value;|(*e1=expre2=expr)$value=e1.value*e2.value;|(/e1=expre2=expr)$value=e1.value/e2.value;,树分析器(TreeParser),grammarcal;optionsoutput=AST;ASTLabelType=CommonTree;tokensPROG;STAT;NUM;prog:stat-(PROGstat);stat:exprEOF-(STATexpr);expr:multExpr(+|-)multExpr)*;multExpr:atom(*|/)atom)*;atom:(expr)-expr|INT-(NUMINT);FLOAT:INT(.INT)?;fragmentINT:0.9+;NEWLINE:r?n;WS:(|t|n|r)+skip();,一个计算器的例子,调试工具antlrwork-一个图形化的antlr语法调试工具,一个计算器的例子,importorg.antlr.runtime.*;importorg.antlr.runtime.tree.*;publicclasscalMainpublicstaticvoidmain(Stringargs)throwsExceptionANTLRInputStreaminput=newANTLRInputStream(System.in);calLexerlexer=newcalLexer(input);CommonTokenStreamtokens=newCommonTokenStream(lexer);calParserparser=newcalParser(tokens);trycalParser.prog_returnr=parser.prog();System.out.println(BaseTree)r.getTree().toStringTree();catch(RecognitionExceptione)System.err.println(e);,测试,treegrammarcalTree;optionsASTLabelType=CommonTree;output=template;headerimportjava.util.Map;importjava.util.HashMap;membersMapvalueMap=newHashMap();prog:(PROGs=stat)System.out.println(Computeresult:+s.value);statreturnsFloatvalue:(STATe=expr)$value=e.value;exprreturnsFloatvalue:(+e1=expre2=expr)$value=e1.value+e2.value;|(-e1=expre2=expr)$value=e1.value-e2.value;|(*e1=expre2=expr)$value=e1.value*e2.value;|(/e1=expre2=expr)$value=e1.value/e2.value;|a=atom$value=a.value;atomreturnsFloatvalue:(NUMi=FLOAT)$value=Float.parseFloat(i.getText();,增加一个树分析器,增加如下代码CommonTreet=(CommonTree)r.getTree();CommonTreeNodeStreamnodes=newCommonTreeNodeStream(t);nodes.setTokenStream(tokens);CalTreewalker=newCalTree(nodes);walker.prog();,增加一个树分析器,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1,一个Sql的解析过程(语法分析),SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1,语法分析,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1,语法分析生成AST,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1,语义分析(SemanticAnalyzerFactory),SemanticAnalyzerFactory,BaseSemanticAnalyzer,SemanticAnalyzer,DDLSemanticAnalyzer,FunctionSemanticAnalyzer,LOADSemanticAnalyzer,ExplainSemanticAnalyzer,根据语法树的根节点类型选择相应的分析器,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1caseHiveParser.TOK_SELECT:qb.countSel();qbp.setSelExprForClause(ctx_1.dest,ast);if(ASTNode)ast.getChild(0).getToken().getType()=HiveParser.TOK_HINTLIST)/设置HINTs(MAPJOIN,STREAMTABLE,HOLD_DDLTIME)qbp.setHints(ASTNode)ast.getChild(0);LinkedHashMapaggregations=doPhase1GetAggregationsFromSelect(ast);doPhase1GetColumnAliasesFromSelect(ast,qbp);qbp.setAggregationExprsForClause(ctx_1.dest,aggregations);qbp.setDistinctFuncExprsForClause(ctx_1.dest,doPhase1GetDistinctFuncExprs(aggregations);break;读取并设置HINTs设置字段列表和别名设置聚集函数和Distinct函数将上述信息保存到QBParseInfo容器中,Select语句的分析,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1caseHiveParser.TOK_FROM:intchild_count=ast.getChildCount();if(child_count!=1)thrownewSemanticException(MultipleChildren+child_count);/Checkifthisisasubquery/lateralviewASTNodefrm=(ASTNode)ast.getChild(0);if(frm.getToken().getType()=HiveParser.TOK_TABREF)processTable(qb,frm);elseif(frm.getToken().getType()=HiveParser.TOK_SUBQUERY)processSubQuery(qb,frm);elseif(frm.getToken().getType()=HiveParser.TOK_LATERAL_VIEW)processLateralView(qb,frm);elseif(isJoinToken(frm)processJoin(qb,frm);qbp.setJoinExpr(frm);break;,From语句的分析,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1caseHiveParser.TOK_GROUPBY:/Getthegroupbyaliases-thesearealiasedtotheentriesinthe/selectlistif(qbp.getSelForClause(ctx_1.dest).getToken().getType()=HiveParser.TOK_SELECTDI)thrownewSemanticException(ErrorMsg.SELECT_DISTINCT_WITH_GROUPBY.getMsg(ast);qbp.setGroupByExprForClause(ctx_1.dest,ast);skipRecursion=true;break;检查语法DISTINCT和groupby不能在同一个sql中设置groupby到容器,Groupby语句的分析,SELECTA.MEMBER_ID,COUNT(*)FROMAJOINBONA.MEMBER_ID=B.MEMBER_IDGROUPBYA.MEMBER_IDHAVINGCOUNT(*)1caseHiveParser.TOK_HAVING:qbp.setHavingExprForClause(ctx_1.dest,ast);qbp.addAggregationExprsForClause(ctx_1.dest,doPhase1GetAggregationsFromSelect(ast);break;设置HAVING字句添加HAVING中的聚集函数两个主要容器qb存放sqlblock的基本单元QBPraseInfo:存放语义分析后的信息,HAVING语句的分析,/获取实际的列的标号如_col0_col1_co2ArrayListcolList=conf.getColList();eval=newExprNodeEvaluatorcolList.size();for(inti=0;icolList.size();i+)assert(colList.get(i)!=null);evali=ExprNodeEvaluatorFactory.get(colList.get(i);/生成REDUCE的输出格式for(inti=0;i1需要2阶段map-reduce第一个阶段的select逻辑操作树SelectOperatorexpressions:expr:_col0type:stringoutputColumnNames:_col0输出A.member_id第二阶段的select逻辑操作树SelectOperatorexpressions:expr:_col0type:stringexpr:_col1type:bigintoutputColumnNames:_col0,_col1输出A.member_id,count(*),一个SelectOperator的例子,物理计划的生成通过genMapRedTasks,递归访问逻辑操作树,将前面的逻辑计划操作树转换成一系列的序列化的Map/Reduce任务并将生成的计划输出到一个xml文件中,并返回Driver类物理计划的执行最后,调用execute()方法,提交至hadoop作业,完成整个sql的执行,物理计划,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!