转载自Hive鲜为人知的宝石-Hooks_浪尖聊大数据-浪尖的博客-CSDN博客
1. 什么是Hoooks?
Hook是一种在处理过程中拦截事件,消息或函数调用的机制。 Hive hooks是绑定到了Hive内部的工作机制,无需重新编译Hive。从这个意义上讲,提供了使用hive扩展和集成外部功能的能力。换句话说,Hive hadoop可用于在查询处理的各个步骤中运行/注入一些代码。根据钩子的类型,它可以在查询处理期间的不同点调用:
- Pre-execution hooks-在执行引擎执行查询之前,将调用Pre-execution hooks。请注意,这个目的是此时已经为Hive准备了一个优化的查询计划。
- Post-execution hooks -在查询执行完成之后以及将结果返回给用户之前,将调用Post-execution hooks 。
- Failure-execution hooks -当查询执行失败时,将调用Failure-execution hooks 。
- Pre-driver-run 和post-driver-run hooks-在driver执行查询之前和之后调用Pre-driver-run 和post-driver-run hooks。
- Pre-semantic-analyzer 和 Post-semantic-analyzer hooks-在Hive在查询字符串上运行语义分析器之前和之后调用Pre-semantic-analyzer 和Post-semantic-analyzer hooks。
2. Hive Hook API
Hive支持许多不同类型的Hook。 Hook接口是Hive中所有Hook的父接口。它是一个空接口,并通过以下特定hook的接口进行了扩展:
- PreExecute和PostExecute将Hook接口扩展到Pre和Post执行hook。
- ExecuteWithHookContext扩展Hook接口以将HookContext传递给hook。HookContext包含了hook可以使用的所有信息。 HookContext被传递给名称中包含“WithContext”的所有钩子。
- HiveDriverRunHook扩展了Hook接口,在driver阶段运行,允许在Hive中自定义逻辑处理命令。
- HiveSemanticAnalyzerHook扩展了Hook接口,允许插入自定义逻辑以进行查询的语义分析。它具有preAnalyze()和postAnalyze()方法,这些方法在Hive执行自己的语义分析之前和之后执行。
- HiveSessionHook扩展了Hook接口以提供会话级hook。在启动新会话时调用hook。用hive.server2.session.hook配置它。
- Hive 1.1添加了Query Redactor Hooks。它是一个抽象类,它实现了Hook接口,可以在将查询放入job.xml之前删除有关查询的敏感信息。可以通过设置hive.exec.query.redactor.hooks属性来配置此hook。
3. hive查询的生命周期
hook查询在hive中的执行过程:
- Driver接受命令。
- org.apache.hadoop.hive.ql.HiveDriverRunHook.preDriverRun() 读取hive.exec.pre.hooks决定要运行的pre-hooks 。
- org.apache.hadoop.hive.ql.Driver.compile()通过创建代表该查询的抽象语法树(AST)来开始处理查询。
- org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook实现了HiveSemanticAnalyzerHook,调用preAnalyze() 方法。
- 对抽象语法树(AST)执行语义分析。
- org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook.postAnalyze()会被调用,它执行所有配置的语义分析hooks。
- 创建并验证物理查询计划。
- Driver.execute() 已经准备好开始运行job
- 调用org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext.run() 方法去执行所有的 pre-execution hooks。
- org.apache.hadoop.hive.ql.hooks.ExecDriver.execute()执行该query的所有jobs
- 对于每个job都会执行org.apache.hadoop.hive.ql.stats.ClientStatsPublisher.run(),来为每个job发布统计信息。该间隔是由hive.exec.counters.pull.interval配置控制,默认是1000ms。hive.client.stats.publishers配置决定着运行的publishers。也可以通过设置hive.client.stats.counters来决定发布哪些counters。
- 完成所有task。
- (可选)如果任务失败,请调用hive.exec.failure.hooks配置的hooks。
- 通过堆所有 hive.exec.post.hooks指定的hooks执行ExecuteWithHookContext.run() 来运行post execution hooks。
- org.apache.hadoop.hive.ql.HiveDriverRunHook.postDriverRun()。请注意,这是在查询完成运行之后以及将结果返回给客户端之前运行的。
- 返回结果。
其他参考文献:利用SemanticAnalyzerHook来过滤不加分区条件的Hive查询_lalaguozhe的博客-CSDN博客_hive.semantic.analyzer.hook