복붙노트

[HADOOP] oazie Java 액션에서 HBase 자격 증명 전달

HADOOP

oazie Java 액션에서 HBase 자격 증명 전달

보안 hbase와 상호 작용하는 oozie Java 작업을 예약해야하므로 hbase 자격 증명을 Java 작업에 제공해야합니다. 보안 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>

또한 HbaseCredentials 클래스를 포함하도록 oozie 속성을 수정했습니다.

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

하지만 오류가 발생하는 작업을 실행할 수 없습니다, 아래 stacktrace입니다

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 상호 작용이있는 작업 일뿐입니다. lib 디렉토리에 hbase jar를 모두 포함 시켰습니다. 문제를 파악할 수 없습니다.

업데이트 된 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>

해결법

  1. ==============================

    1.이 솔루션은 HDP2.2.8에서 테스트되었습니다.

    이 솔루션은 HDP2.2.8에서 테스트되었습니다.

  2. ==============================

    2.이러한 "자격 증명"은 귀하의 업무가 아닌 Oozie 서비스에 의해 관리됩니다.

    이러한 "자격 증명"은 귀하의 업무가 아닌 Oozie 서비스에 의해 관리됩니다.

    그래서, HortonWorks가 그들의 배포판을 포장하기에 알맞은 일을했다면 ...

    Prod 클러스터에 설치된 HDP2.2.4의 경우는 아닙니다. 아그. 저 빌어 먹을 릴리스에서 망가졌습니다. HBase에 실제로 연결하기 전에 HDFS에서 keytab 을 다운로드하고 TGT를 생성하여 Kerberos 티켓을 모두 관리해야합니다. 우린 거기에 있었어.

    그것이 어떻게 행해질 수 있는지에 대한 통찰력을 얻기 위해 그 포스트를보십시오.

  3. from https://stackoverflow.com/questions/33212535/passing-hbase-credentials-in-oozie-java-action by cc-by-sa and MIT license