通过kerberized集群上的oozie java操作执行Hive查询

时间:2016-03-21 10:42:10

标签: java hive kerberos oozie hortonworks-data-platform

我正在尝试通过安全群集上的oozie Java操作执行配置单元查询,但是我遇到了异常:

>>> Invoking Main class now >>>

Launch time = 1458542514082
Job launch time = 1458542514082 mapreduce.job.tags = oozie-2e8d7ed9fc7551a353667830e09bef2b
Main class        : com.citiustech.main.Test
Arguments         :


<<< Invocation of Main class completed <<<

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.JavaMain], main() threw exception,  
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException:  
Could not open client transport with JDBC Uri: jdbc:hive2://10.60.2.26:10000/default;principal=hive/example-qa1- 
dn2@EXAMPLE.com;auth=NOSASL: GSS initiate failed
org.apache.oozie.action.hadoop.JavaMainException: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC  
Connection; nested exception is java.sql.SQLException: Could not open client transport with JDBC Uri:  
jdbc:hive2://10.60.2.26:10000/default;principal=hive/example-qa1-dn2@EXAMPLE.com;auth=NOSASL: GSS initiate failed
    at org.apache.oozie.action.hadoop.JavaMain.run(JavaMain.java:58)
    at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:39)
    at org.apache.oozie.action.hadoop.JavaMain.main(JavaMain.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:226)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is  
java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://10.60.2.26:10000/default;principal=hive/example- 
qa1-dn2@EXAMPLE.com;auth=NOSASL: GSS initiate failed
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:391)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:471)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:481)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:491)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:497)
    at com.citiustech.main.Test.main(Test.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.oozie.action.hadoop.JavaMain.run(JavaMain.java:55)
    ... 15 more
Caused by: java.sql.SQLException: Could not open client transport with JDBC Uri:  
jdbc:hive2://10.60.2.26:10000/default;principal=hive/example-qa1-dn2@EXAMPLE.com;auth=NOSASL: GSS initiate failed
    at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:210)
    at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:156)
    at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:187)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager 
(DriverManagerDataSource.java:153)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver 
(AbstractDriverBasedDataSource.java:155)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:120)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 26 more
Caused by: org.apache.thrift.transport.TTransportException: GSS initiate failed
    at org.apache.thrift.transport.TSaslTransport.sendAndThrowMessage(TSaslTransport.java:232)
    at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:316)
    at org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37)
    at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:52)
    at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:49)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
    at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport.open(TUGIAssumingTransport.java:49)
    at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:185)
    ... 36 more

Oozie Launcher failed, finishing Hadoop job gracefully

Oozie Launcher, uploading action data to HDFS sequence file: hdfs://example-qa1-nn:8020/user/admin/oozie-oozi/0000000- 
160317141545276-oozie-oozi-W/javaAction--java/action-data.seq

Oozie Launcher ends

请查看以下工作流程xml,指定oozie java action和用于执行配置单元查询的java程序:

Workflow.xml:

<workflow-app name="WorkFlowForJavaActionToExecuteHiveQuery" xmlns="uri:oozie:workflow:0.2.5">
    <credentials>                      
  <credential name='hive_credentials' type='hcat'>
                        <property>
                            <name>hcat.metastore.uri</name>
                            <value>thrift://example-qa1-dn2:9083</value>
                        </property>
                        <property>
                            <name>hcat.metastore.principal</name>
                            <value>hive/_HOST@EXAMPLE.COM</value>
                        </property>
                </credential>
 </credentials>
    <start to="javaAction"/>
<action name="javaAction" cred="hive_credentials">
        <java>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>

    <main-class>com.demo.main.Test</main-class>
        </java>
        <ok to="end"/>
        <error to="fail"/>
    </action>

     <kill name="fail">
        <message>Job failed, error
            message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

Java程序:

package com.demo.main;

import java.io.IOException;

import org.apache.hadoop.security.UserGroupInformation;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class Test {
    public static void main(String[] args) throws IOException {
        UserGroupInformation.loginUserFromKeytab("admin@EXAMPLE.COM", "/etc/security/keytabs/admin.keytab");

        org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab("admin@EXAMPLE.COM", "/etc/security/keytabs/admin.keytab");



        DriverManagerDataSource dataSource = new DriverManagerDataSource 
("jdbc:hive2://10.60.2.26:10001/default;principal=hive/example-qa1-dn2@EXAMPLE.com", "hive", "");
        dataSource.setDriverClassName("org.apache.hive.jdbc.HiveDriver");
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);

        long count = 0;
        count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM provider",Long.class);
        System.out.println("Count is *************************"+count);
    }
}

我使用可以访问配置单元的admin用户提交了工作流作业。

我使用UserGroupInformation API以编程方式为管理员用户做了kinit,但我仍然获得了异常。 我在oozie HDFS缓存中只保留了spring core,spring jdbc和hive jdbc jar。

我也尝试过在hortonworks,堆栈溢出和其他论坛上提到的所有可能的解决方案,但是我仍然面临同样的问题。

有人可以就此问题提出任何解决方案吗?

0 个答案:

没有答案