在 oozie Java 操作中传递 HBase 凭据
Passing HBase credentials in oozie Java Action
我需要安排一个与安全 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 Class
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>
这些 "credentials" 由 Oozie 服务 管理,而不是由您的工作管理。
所以,如果 HortonWorks 在打包他们的发行版方面做得不错...
hbase-common-*-hadoop2.jar
会部署在
/usr/hdp/current/oozie-client/libserver/
安装中
- JAR 不会与其他 JAR 在定义上发生冲突
classorg.apache.hadoop.conf.Configuration
- 最终您将能够管理 HBase
Oozie 中的凭据
安装在我们的 Prod 集群上的 HDP2.2.4 不是这种情况。啊。 在那该死的版本中,该死的东西坏了。您必须自己管理 Kerberos 票证 ,从 HDFS 下载密钥表 <file>
并在实际连接到 HBase 之前创建 TGT。我们去过那里。
查看 以获得有关如何完成的一些见解。
此解决方案已在 HDP2.2.8 上测试:
复制到 /usr/hdp/current/oozie-server/oozie-server/webapps/oozie/WEB-INF/lib
以下 jars:
- hbase-客户端-*-hadoop2.jar
- hbase-common-*-hadoop2.jar
- hbase-协议-*-hadoop2.jar
- hbase-server-*-hadoop2.jar
- htrace-core-2.04.jar
重新启动 Oozie 服务器。
我需要安排一个与安全 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 Class
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>
这些 "credentials" 由 Oozie 服务 管理,而不是由您的工作管理。
所以,如果 HortonWorks 在打包他们的发行版方面做得不错...
hbase-common-*-hadoop2.jar
会部署在/usr/hdp/current/oozie-client/libserver/
安装中- JAR 不会与其他 JAR 在定义上发生冲突 classorg.apache.hadoop.conf.Configuration
- 最终您将能够管理 HBase Oozie 中的凭据
安装在我们的 Prod 集群上的 HDP2.2.4 不是这种情况。啊。 在那该死的版本中,该死的东西坏了。您必须自己管理 Kerberos 票证 ,从 HDFS 下载密钥表 <file>
并在实际连接到 HBase 之前创建 TGT。我们去过那里。
查看
此解决方案已在 HDP2.2.8 上测试:
复制到
/usr/hdp/current/oozie-server/oozie-server/webapps/oozie/WEB-INF/lib
以下 jars:- hbase-客户端-*-hadoop2.jar
- hbase-common-*-hadoop2.jar
- hbase-协议-*-hadoop2.jar
- hbase-server-*-hadoop2.jar
- htrace-core-2.04.jar
重新启动 Oozie 服务器。