我需要在Apache Hive中挂钩自定义执行挂钩。如果有人知道该怎么做,请告诉我。

我正在使用的当前环境如下:

Hadoop:Cloudera版本4.1.2
作业系统:Centos

谢谢,
阿伦

最佳答案

根据要在哪个阶段注入(inject)自定义代码,挂钩有几种类型:

  • 驱动程序运行挂钩(前/后)
  • 语义分析器挂钩(前/后)
  • 执行钩子(Hook)(Pre / Failure / Post)
  • 客户统计信息发布者

  • 如果运行脚本,则处理流程如下所示:
  • Driver.run()使用命令
  • HiveDriverRunHook.preDriverRun()(HiveConf.ConfVars.HIVE_DRIVER_RUN_HOOKS)
  • Driver.compile()开始处理命令:创建抽象语法树
  • AbstractSemanticAnalyzerHook.preAnalyze()(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK)
  • 语义分析
  • AbstractSemanticAnalyzerHook.postAnalyze()(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK)
  • 创建并验证查询计划(物理计划)
  • Driver.execute():准备运行作业
  • ExecuteWithHookContext.run()(HiveConf.ConfVars.PREEXECHOOKS)
  • ExecDriver.execute()运行所有作业
  • 对于每个HiveConf.ConfVars.HIVECOUNTERSPULLINTERVAL间隔的每个作业:
    ClientStatsPublisher.run()被调用以发布统计信息
    (HiveConf.ConfVars.CLIENTSTATSPUBLISHERS)
    如果任务失败:ExecuteWithHookContext.run() (HiveConf.ConfVars.ONFAILUREHOOKS)
  • 完成所有任务
  • ExecuteWithHookContext.run()(HiveConf.ConfVars.POSTEXECHOOKS)
  • 返回结果之前HiveDriverRunHook.postDriverRun()(HiveConf.ConfVars.HIVE_DRIVER_RUN_HOOKS)
  • 返回结果。

  • 对于每个挂钩,我都指出了必须实现的接口(interface)。在方括号中
    有相应的conf。支柱。您必须设置才能注册
    脚本开头的类(class)。
    例如:设置PreExecution挂钩(工作流程的第9阶段)
    HiveConf.ConfVars.PREEXECHOOKS -> hive.exec.pre.hooks :
    set hive.exec.pre.hooks=com.example.MyPreHook;
    

    不幸的是,这些功能并未真正记录,但是您始终可以查看Driver类以查看挂钩的评估顺序。

    备注:我在这里假设Hive为0.11.0,我不认为Cloudera发行版
    不同(太多)

    08-28 05:57