Hive源码分析
2023-02-14 10:56:28 23 举报
Hive是一个基于Hadoop的数据仓库工具,它提供了类似于SQL的查询语言(HQL)来查询存储在Hadoop分布式文件系统上的数据。Hive的主要组件包括:编译器、优化器、执行器和元数据存储。编译器将HQL语句转换为一个或多个执行计划,优化器对这些执行计划进行优化以提高查询性能,执行器负责实际执行查询并将结果返回给用户,元数据存储用于存储表的结构信息和统计信息。Hive支持多种数据格式,如文本文件、SequenceFile、Avro等,并提供了丰富的数据操作功能,如分区、桶、视图等。
作者其他创作
大纲/内容
MapRedTasks实现类
new TokenRewriteStream(lexer)
new ParseContext(....)
ctx.getMRTmpPath()
可运行的task
第六步:生成表访问统计数据(非必要)
根据HiveParser.g文件对token解析生产抽象语法树
runInternal(command)
第四步:为优化器和物理编译器生成解析上下文
putAccessedColumnsToReadEntity()
DriverContext
ConcurrentLinkedQueue
设置输出数据key-vlaue
ParseDriver.parse()
第二步
rj = jc.submitJob(job)
第一步:将抽象语法树解析成解析树AST Tree -> Parse Tree(QueryBlock)
genResolvedParseTree(ast)
job.setMapperClass(ExecMapper.class)job.setReducerClass(ExecReducer.class)
1、解析参数-e -f -v -i -H -S2、设置输入输出流 3、设置hive配置 set xxxxxx
executeDriver()
genOPTree(ast)
和CBO优化有关
Plan
第一步:把SQL语句转化成物理执行计划
将SQL转成TOKEN
plan
TaskCompilerFactory.getCompiler() compiler.init() compiler.compile()
job.setOutputKeyClass(Text.class) job.setOutputValueClass(Text.class)
BaseSemanticAnalyzer.analyzeInternal(ASTNode ast)
ASTNode tree = (ASTNode) r.getTree()
CliDriver
1、optm.initialize(conf) 初始化各种优化措施2、optm.optimize() 依次执行优化
第七步:执行逻辑优化
new HiveLexerX()
job.setMapOutputKeyClass(HiveKey.class); job.setMapOutputValueClass(BytesWritable.class)
tskRun.runSequential()
saveViewDefinition()
1、处理 -e参数的sql 2、处理 -f 参数的sql 3、处理命令行输入的sql
main()
SemanticAnalyzer.analyzeInternal(ASTNode ast)
输出explain执行计划
第三步
ExecDriver
第一步
TaskTree
run()
TaskCompiler
第四步:将备份task加入队列driverCxt.addToRunnable(backupTask)
SemanticAnalyzer
第二步:提交物理执行计划到yarn运行
第五步:处理视图有关的(非必要)
第二步:将task添加到队列 driverCxt.addToRunnable(tsk)
正在运行的task
设置分区器
第八步:如果需要,生成列访问统计数据-在优化过程中等待列修剪
第二步:将Parse Tree 转成 Operator Tree
tableAccessAnalyzer.analyzeTableAccess()
设置Map输出的key-value
获取存储MR中间数据的hdfs路径
设置是否推测执行机制
ParseDriver
第一步:构建new DriverContext(ctx)
构建词法解析器(HiveLexer.g)
第五步:1、打印资源使用情况2、打印\"OK\"
plan = new QueryPlan()
columnAccessAnalyzer.analyzeColumnAccess()
tsk.executeTask
创建CliDriver实例对象
Driver
第一个if分支处理quit/exit第二个if分支处理source第三个if分支处理 ! 开头的脚本第四个if分支处理正常SQL
设置输入文件格式
设置输出格式
processLine(line)
execute(driverContext)
font color=\"#b71c1c\
关联mapper和reducer
tskRun.start()
第十一步:将访问的列放入readEntity
cxt.launching(tskRun)
processLocalCmd()
1、获取不同执行引擎的优化器2、再次执行逻辑优化optimizeOperatorPlan(...)3、生成TaskTree generateTaskTree(...)4、优化TaskTreee optimizeTaskPlan(...)5、根据参数决定执行模式decideExecMode(...)
super.execute(driverContext)
convertRowSchemaToResultSetSchema()
job.setOutputFormat(HiveOutputFormatImpl.class)
设置reduceTask个数
1、line参数是一段 ; 分割的sql2、处理Ctrl+C3、去除注销中断;
job.setInputFormat(JavaUtils.loadClass(inpFormat))
Optimizer optm = new Optimizer(); optm.setPctx(pCtx); optm.initialize(conf); pCtx = optm.optimize();
r = parser.statement()
LinkedBlockingQueue
提交JOB
processCmd(command)
new HiveParser(tokens)
execute()
Optimizer
ExecDriver.execute(driverContext)
第三步:推断结果集模式
job.setNumReduceTasks(rWork != null ? rWork.getNumReduceTasks().intValue() : 0)
ASTNode
job.setPartitionerClass(JavaUtils.loadClass(partitioner))
0 条评论
下一页