在 oozie Java Action 中传递 HBase 凭据

Posted

技术标签:

【中文标题】在 oozie Java Action 中传递 HBase 凭据【英文标题】:Passing HBase credentials in oozie Java Action 【发布时间】:2015-10-19 10:51:20 【问题描述】:

我需要安排一个与安全 hbase 交互的 oozie Java 操作,因此我需要为 Java 操作提供 hbase 凭据。我正在使用安全的 hortonworks 2.2 环境,我的工作流 XML 如下

<workflow-app xmlns="uri:oozie:workflow:0.4" name="solr-wf">
    <credentials>
         <credential name="hbase" type="hbase">
         </credential>
      </credentials>

    <start to="java-node"/>
    <action name="java-node" cred="hbase">
        <java>  
             <job-tracker>$jobTracker</job-tracker>
             <name-node>$nameNode</name-node>
             <main-class>com.test.hbase.TestHBaseSecure</main-class>
            <arg>$arg1</arg>
        </java>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Java failed, error message[$wf:errorMessage(wf:lastErrorNode())]</message>
    </kill>
    <end name="end"/>
</workflow-app>

我还修改了 oozie 属性以包含 HbaseCredentials 类

oozie.credentials.credentialclasses=hcat=org.apache.oozie.action.hadoop.HCatCredentials,hbase=org.apache.oozie.action.hadoop.HbaseCredentials

但我无法运行它引发错误的作业,下面是堆栈跟踪

java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
    at org.apache.oozie.action.hadoop.HbaseCredentials.copyHbaseConfToJobConf(HbaseCredentials.java:60)
    at org.apache.oozie.action.hadoop.HbaseCredentials.addtoJobConf(HbaseCredentials.java:49)
    at org.apache.oozie.action.hadoop.JavaActionExecutor.setCredentialTokens(JavaActionExecutor.java:1054)
    at org.apache.oozie.action.hadoop.JavaActionExecutor.submitLauncher(JavaActionExecutor.java:913)
    at org.apache.oozie.action.hadoop.JavaActionExecutor.start(JavaActionExecutor.java:1135)
    at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:228)
    at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:63)
    at org.apache.oozie.command.XCommand.call(XCommand.java:281)
    at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:323)
    at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:252)
    at org.apache.oozie.service.CallableQueueService$CallableWrapper.run(CallableQueueService.java:174)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

其他作业运行良好,只有与 hbase 交互的作业失败。我已将所有 hbase jar 包含在我的 lib 目录中,但我无法找出问题所在。

更新的 workflow.xml:

<workflow-app xmlns="uri:oozie:workflow:0.4" name="$appName">
<credentials>
        <credential name="hbase-cred" type="hbase">
            <property>
                <name>hbase.master.kerberos.principal</name>
                <value>hbase/_HOST@ABC.COM</value>
            </property>

            <property>
                <name>hbase.master.keytab.file</name>
                <value>/etc/security/keytabs/hbase.service.keytab</value>
            </property>

            <property>
                <name>hbase.regionserver.kerberos.principal</name>
                <value>hbase/_HOST@ABC.COM</value>
            </property>

            <property>
                <name>hbase.regionserver.keytab.file</name>
                <value>/etc/security/keytabs/hbase.service.keytab</value>
            </property>

            <property>
                <name>hbase.security.authentication</name>
                <value>kerberos</value>
            </property>

            <property>
                <name>hbase.zookeeper.quorum</name>
                <value>dev1-dn2,dev1-dn3,dev1-dn1</value>
            </property>

            <property>
                <name>zookeeper.znode.parent</name>
                <value>/hbase-secure</value>
            </property>
        </credential>


    </credentials>
    <start to="java-node" />
    <action name="java-node" cred='hbase-cred'>
        <java>
            <job-tracker>$jobTracker</job-tracker>
            <name-node>$nameNode</name-node>
            <main-class>com.test.hbase.TestHBaseSecure</main-class>
        </java>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Java failed, error message[$wf:errorMessage(wf:lastErrorNode())]</message>
    </kill>
    <end name="end" />
</workflow-app>

【问题讨论】:

我的解决方案对你有用吗? 是的,它有效,但是在添加 jars 后出现了一些连接问题,我认为它正在尝试连接到某个默认主机以获取令牌,我在凭证部分添加了一些属性并且它有效,我在问题中添加修改后的凭据部分 @RuslanOstafiichuk 我已经根据 oozie 站点的文档进行了配置,最初在 cmd 提示符下提交作业没有任何问题,但在资源管理器 UI 中,它没有显示任何接受或运行状态。作业运行了很长时间,由于接收 Hbase 凭据 org.apache.hadoop.hbase.client.RetriesExhaustedException 异常而暂停,此时没有记录任何问题。请建议我是否需要设置任何配置。?谢谢, @mathes 我遇到了同样的问题,在 hbase credentail 部分添加配置部分后解决了,请参阅更新的 workflow.xml 以获得所需的配置,检查它是否适合您 @CTDex 即使在 workflow.xml 中添加了正确的凭据属性后,我现在也面临着类似的问题。您能否分享您的 Java 代码示例。我需要检查 Java 代码中是否缺少任何内容。 【参考方案1】:

此解决方案已在 HDP2.2.8 上测试:

    复制到/usr/hdp/current/oozie-server/oozie-server/webapps/oozie/WEB-INF/lib以下jar:

    hbase-client-*-hadoop2.jar hbase-common-*-hadoop2.jar hbase-protocol-*-hadoop2.jar hbase-server-*-hadoop2.jar htrace-core-2.04.jar

    重启 Oozie 服务器。

【讨论】:

【参考方案2】:

这些“凭据”由 Oozie 服务而非您的工作管理。

所以,如果 HortonWorks 在打包他们的发行版方面做得不错……

    hbase-common-*-hadoop2.jar 将被部署在 /usr/hdp/current/oozie-client/libserver/ 安装时 JAR 不会与其他 JAR 的定义冲突 类 org.apache.hadoop.conf.Configuration 最终您将能够管理 HBase Oozie 中的凭据

安装在我们的 Prod 集群上的 HDP2.2.4 并非如此。啊。 该死的东西在那个该死的版本中被打破了。您必须自己管理 Kerberos 票证,从 HDFS 下载 keytab &lt;file&gt; 并在实际连接到 HBase 之前创建 TGT。我们去过那里。

查看that post,了解有关如何完成此操作的一些见解。

【讨论】:

你能试试我的解决方案吗? 嗯,实际上,不,我不能——转移到另一个任务,不再有权访问那个 Oozie + HBase + Kerberos 设置。

以上是关于在 oozie Java Action 中传递 HBase 凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oozie 中将 pig 选项作为参数传递?

通过 SQOOP Action 在 OOZIE 中列出 MS SQL Server 表

tez 模式下的 Oozie hive 脚本调度

Oozie4.3.1各种Action及综合实例

Oozie4.3.1各种Action及综合实例

Oozie-自定义实现WorkFlow中shell action