热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hive内置函数_HiveQuery生命周期——钩子(Hook)函数篇

无论你通过哪种方式连接Hive(如HiveCli、HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析、编译、优
无论你通过哪种方式连接Hive(如Hive Cli、HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析、编译、优化器处理、执行器执行四个方面。7ae21118ffb41dcfbe38214a2cd93cda.png

以Hive目前原生支持计算引擎MapReduce为例,具体处理流程如下:

  1. HQL解析生成AST语法树Antlr定义SQL的语法规则,完成SQL词法和语法解析,将SQL转化为抽象语法树AST Tree
  2. 语法分析得到QueryBlock遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  3. 生成逻辑执行计划遍历QueryBlock,翻译为执行操作树Operator Tree
  4. Logical Optimizer Operator进行逻辑优化逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  5. 生成物理执行计划Task Plan遍历Operator Tree,翻译为MapReduce任务
  6. 物理优化Task Tree,构建执行计划QueryPlan物理层优化器进行MapReduce任务的变换,生成最终的执行计划
  7. 表以及其他操作鉴权
  8. 执行引擎执行

在Hive Query整个生命周期中,会有如下钩子函数被执行:

HiveDriverRunHook的preDriverRun该钩子函数由参数hive.exec.driver.run.hooks控制,决定要运行的pre hooks,多个钩子实现类以逗号间隔,钩子需实现 org.apache.hadoop.hive.ql.HiveDriverRunHook接口。

HiveSemanticAnalyzerHook的preAnalyze

在Driver开始run之前,HQL经过解析会进入编译阶段的语法分析,而在语法分析前会经过钩子HiveSemanticAnalyzerHook的preAnalyze方法处理。该钩子函数由hive.semantic.analyzer.hook配置,钩子需实现org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHook接口。

HiveSemanticAnalyzerHook的postAnalyze

与preAnalyze同属于一个钩子类,配置参数相同,会执行所有配置的语义分析hooks,但它位于Hive的语法分析之后,可以获取HQL的输入和输出表及分区信息,以及语法分析得到的task信息,由此可以判断是否是需要分布式执行的任务,以及执行引擎是什么。

生成执行计划之前的redactor钩子

该钩子由hive.exec.query.redactor.hooks配置,多个实现类以逗号间隔,钩子需继承org.apache.hadoop.hive.ql.hooks.Redactor抽象类,并替换redactQuery方法。

这个钩子函数是在语法分析之后,生成QueryPlan之前,所以执行它的时候语法分析已完成,具体要跑的任务已定,这个钩子的目的在于完成QueryString的替换,比如QueryString中包含敏感的表或字段信息,在这里都可以完成替换,从而在Yarn的RM界面或其他方式查询该任务的时候,会显示经过替换后的HQL。

task执行前的preExecutionHook

在执行计划QueryPlan生成完,并通过鉴权后,就会执行具体的task,而task执行之前会经过一个钩子函数,钩子函数由hive.exec.pre.hooks配置,多个钩子实现类以逗号间隔。实现方式:

1)实现org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext
通过实现该接口的run方法,执行所有的pre-execution hooks

// Pre/Post Execute Hook can run with the HookContextpublic interface ExecuteWithHookContext extends Hook {/** hookContext: The hook context passed to each hooks. * HookContext带有执行计划、Hive的配置信息、Lineage、UGI、提交的用户以及输入输出表等信息 */void run(HookContext hookContext) throws Exception;}2)实现org.apache.hadoop.hive.ql.hooks.PreExecute该接口的run方法已经标注为过时,并且相对于ExecuteWithHookContext,PreExecute提供的信息可能不能完全满足我们的业务需求。

public interface PreExecute extends Hook {/** * The run command that is called just before the execution of the query. * SessionState、UGI、HQL输入表及分区信息,HQL输出表、分区以及本地和hdfs文件目录信息 */@Deprecatedpublic void run(SessionState sess, Set inputs,Set outputs, UserGroupInformation ugi) throws Exception;}task执行失败时的ON_FAILURE_HOOKS

task执行失败时,Hive会调用这个hook执行一些处理措施。该钩子由参数hive.exec.failure.hooks配置,多个钩子实现类以逗号间隔。需实实现org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext接口。

task执行完成时的postExecutionHook

在task任务执行完成后执行。如果task失败,会先执行ON_FAILURE_HOOKS,之后执行postExecutionHook,该钩子由参数hive.exec.post.hooks指定的hooks(多个钩子实现类以逗号间隔)执行post execution hooks。实现方式:

1)实现org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext

2)实现org.apache.hadoop.hive.ql.hooks.PostExecute

ExecuteWithHookContext和PostExecute跟分别与上述task执行前的preExecutionHook、PreExecute对应,这里不再赘述。

HiveDriverRunHook的postDriverRun

在查询完成运行之后以及将结果返回给客户端之前执行,与preDriverRun对应。
此外,Hive中已经有一些内置实现的hook,下面举一些例子以及它们的主要作用:

ATSHook:实现了ExecuteWithHookContext,将查询和计划信息推送到Yarn App Timeline Server。

DriverTestHook:实现了HiveDriverRunHook的preDriverRun方法(对postDriverRun是空实现),用于打印输出的命令

EnforceReadOnlyTables:pre execute hook,实现了ExecuteWithHookContext,用于阻止修改只读表。

LineageLogger:实现了ExecuteWithHookContext,它将查询的血统信息记录到日志文件中。LineageInfo包含有关query血统的所有信息。

PreExecutePrinter和PostExecutePrinter:pre和post hook的示例,它将参数打印输出。

PostExecTezSummaryPrinter:post execution hook,实现了ExecuteWithHookContext,可以打印Hive Tez计数器的相关信息。

PostExecOrcFileDump:post execution hook,实现了ExecuteWithHookContext,用于打印ORC文件信息。

UpdateInputAccessTimeHook:pre execution hook,可在运行查询之前更新所有输入表的访问时间。

特别强调一下LineageLogger和LineageInfo,对于做Hive血缘关系分析很有参考价值,当然Hive血缘分析不是本篇文章的重点,这里先不做展开。


通过对上面Hive中hook的执行"位置"和作用,以及Hive本身实现的一些Hook,分析可知:自定义hook,比如实现一个pre execution hook。

首先在maven的pom中引入hive-exec的依赖,如:

org.apache.hivegroupId> hive-execartifactId> 2.1.0version>dependency>

此外,还需创建一个实现ExecuteWithHookContext的类,实现其中的run方法,并设置相应的参数,使自定义的hook类生效。

最后,通过一张图,来对Hive Hook做个总结:

095279e69a89f409eadf9f8794b9a5b8.png

关联文章:Hive Join优化Apache Hive
关注大数据学习与分享,获取更多技术干货

ebb26f5f50bb1ddef1bd47381febc1cb.png



推荐阅读
  • 2018-02-1420:07:13,610ERROR[main]regionserver.HRegionServerCommandLine:Regionserverexiting ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  •        在搭建Hadoop环境之前,请先阅读如下博文,把搭建Hadoop环境之前的准备工作做好,博文如下:       1、CentOS6.7下安装JDK,地址:http:b ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • CentOS 7配置SSH远程访问及控制
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • IamsettingupApacheserverwithTortoiseSVNforalocalsourcecoderepository.Ihaveobservedt ... [详细]
  • react项目无法编译2.npm错误信息: ... [详细]
  • SparkOnYarn在YARN上启动Spark应用有两种模式。在cluster模式下,Spark驱动器(driver)在YARNApp ... [详细]
author-avatar
Jessica_猪猪到_697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有