hadoop集群配置了kerberos后,如何使用JAVA程序调用?

cloud-coder 发布于 2015/05/13 14:46
阅读 11K+
收藏 0

hadoop集群配置了kerberos后,如何使用JAVA程序调用?

使用的是Cloudera 的CDH5.3,配置好kerberos后,使用如何JAVA代码访问,总是报:Unable to obtain password from user

public static void test1(String user, String keytab, String dir) throws Exception {
        Configuration conf = new Configuration();
        // conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(user, keytab);
        listDir(conf, dir);
    }

    public static void listDir(Configuration conf, String dir) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        FileStatus files[] = fs.listStatus(new Path(dir));
        for (FileStatus file : files) {
            System.out.println(file.getPath());
        }
    }



报错信息:

Exception in thread "main" java.io.IOException: Login failure for hdfs from keytab /data/soft/kerberos/hdfsaadd.keytab
        at org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:891)
        at com.security.HdfsSecurityDemo.test1(HdfsSecurityDemo.java:64)
        at com.security.HdfsSecurityDemo.main(HdfsSecurityDemo.java:50)
Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user


        at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Krb5LoginModule.java:856)
        at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:719)
        at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:584)
        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 javax.security.auth.login.LoginContext.invoke(LoginContext.java:762)
        at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:690)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:688)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:687)
        at javax.security.auth.login.LoginContext.login(LoginContext.java:595)
        at org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:882)
        ... 2 more


以下是问题补充:

@cloud-coder:使用kinit可以正常登录,并且使用 hadoop fs -ls /var 命令可以正常支行 (2015/05/13 14:46)
加载中
0
g
ggjucheng
远离kerberos,珍爱生命,kerberos对hadoop来说是个大坑,阿里用了之后,马上放弃了。
希望你知道事
希望你知道事
那用什么做 hadoop的安全?
0
cloud-coder
cloud-coder
kerberos对hadoop来说是个大坑? 那阿里目前用什么做安全验证?
0
N
NO0

conf是不是少了几句 ,hbase是这么处理的

static {

 

             // 这个配置文件主要是记录 kerberos的相关配置信息,例如KDC是哪个IP?默认的realm是哪个?

             // 如果没有这个配置文件这边认证的时候肯定不知道KDC的路径喽

             // 这个文件也是从远程服务器上copy下来的

            System. setProperty("java.security.krb5.conf", "C:/Users/dongzeguang/Downloads/krb5.conf" );

            

             conf = HBaseConfiguration.create();

             conf.set("hadoop.security.authentication" , "Kerberos" );

             // 这个hbase.keytab也是从远程服务器上copy下来的, 里面存储的是密码相关信息

             // 这样我们就不需要交互式输入密码了

             conf.set("keytab.file" , "C:/Users/Downloads/hbase.keytab" );

             // 这个可以理解成用户名信息,也就是Principal

             conf.set("kerberos.principal" , "hbase/1722.myip.domain@HADOOP.COM" );           

            UserGroupInformation. setConfiguration(conf);

             try {

                  UserGroupInformation. loginUserFromKeytab("hbase/1722.myip.domain@HADOOP.COM", "C:/Users/Downloads/hbase.keytab" );

            } catch (IOException e) {

                   // TODO Auto-generated catch block

                  e.printStackTrace();

            }

      }

l
lude
如果没有keytab怎么办?
返回顶部
顶部