CouderaHadoop中hive的Hook扩展

最近在做关于CDH4.3.0的hive封装,其中遇到了很多问题!其中最困难的是如何在不更改源代码的情况下动态获取jobId!

    在项目进行的过程中,我们尝试了很多方式!在尝试的过程中虽然也有很多失败,但对于理解hive的内部机制也更一步的认识,我这里想说的是自定义扩展hook!

    在CDH版本的hive中提供了很多hook,俗称钩子函数!这样我们可以通过自定义hook,来对hive进行扩展!这里我就不对hive的执行原理进行赘述了,网上的资料一堆一堆的!中间过程也相当复杂!

    这里我大致描述下hive中的一种hook扩展(org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext),其他的扩展方式基本上都大同小异!

    在此之前我们要先大致清除下hive的执行流程,其中的核心类org.apache.hadoop.ql.Driver类是实际执行hive语句的类,其中核心方法之一有run(cmd),这里的cmd实际就是我们要执行的sql语句了!我们根据ExecuteWithHookContext扩展的hook也是在此方法的前后进行执行!这里我介绍的是如何扩展前置钩,也就是在run(cmd)方法执行之前(hive语句会经过编译优化等步骤生成MapReduce任务,这里还未提交MapReduce任务)

    下面说说该如何进行扩展(这里用的maven构建工具):

    1:自定义一个类实现ExecuteWithHookContext接口

            Hclass MyPreHook implements ExecuteHookContext{

                public void run(HookContext hookContext) throws Exception{

                    //这里我们可以做自己想做的事情,比如拿到SessionState、QueryPlan等,获取各种信息

                }

            }

    2:将上面的自定义hook打成jar包,放置到hive的lib目录下

    3:关键的一步,修改hive-site.xml文件,增加如下配置

        <property>

            <name>hive.exec.pre.hooks</name>

            <value>自定义hook完整类名</value>

        </property>

    4:重启hive(各种方式有所不同,我都是采用hiveserver进行操作,所以我是先kill掉hiveserver服务再启动)

    5:然后再执行hive语句,我们自定义的hook就能自动执行了!

   注:常见问题

        (1):hive启动过程中,出现无法找到自定义的hook!这里可以尝试将扩展jar包添加到Hive的classpath下,可以通过修改hive-env.sh文件实现!

你可能感兴趣的:(hadoop)