java应用访问开启了kerberos验证的HDFS集群

一般情况下,我们想要使用java客户端访问hdfs集群,只需要客户端指定hdfs namenode地址即可;但是开启了kerberos验证的hdfs集群则不行,需要先通过kerberos验证后方可访问hdfs集群。

我创建的是maven项目,pom.xml文件的内容如下:



    4.0.0

    org.example
    untitled6
    1.0-SNAPSHOT


    
        
            org.apache.hadoop
            hadoop-hdfs
            2.5.2
        
        
            org.apache.hadoop
            hadoop-client
            2.5.2
        
        
            org.apache.hadoop
            hadoop-common
            2.5.2
        
    

访问不开启kerberos验证的hdfs集群的代码示例:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.IOException;

public class TestHdfsKerberos {

    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://hdp26.bigdata.cn:9000");
        FileSystem fileSystem = FileSystem.get(conf);
        /**
       * 判断hdfs中指定目录是否存在
       */
       System.out.println(fileSystem.exists(new Path("/home/hbase")));
    }
}

访问开启了kerberos验证的hdfs集群的代码示例:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.IOException;

public class TestHdfsKerberos {


    public static void main(String[] args) {

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://hdp26.bigdata.cn:9000");
        /**
         * hadoop使用kerberos验证
         */
        conf.set("hadoop.security.authentication", "kerberos");
        /**
         * hadoop namenode节点的principal(验证实体)
         */
        conf.set("dfs.namenode.kerberos.principal", "work/[email protected]");
        /**
         * 访问hadoop集群的principal
         */
        conf.set("kerberos.principal", "s3/[email protected]");
        /**
         * 访问hadoop集群的principal对应的keytab文件路径
         */
        conf.set("kerberos.keytab", "src\\files\\s3.keytab");
        /**
         * krb5.conf->kerberos客户端配置文件,这个Kerberos配置文件是必须配置的,不然找不到kerberos服务
         */
        System.setProperty("java.security.krb5.conf", "src\\files\\krb5.conf");
        UserGroupInformation.setConfiguration(conf);
        try {
            //使用待验证的实体,调用loginUserFromKeytab api向hbase进行kerberos验证
            UserGroupInformation.loginUserFromKeytab("s3/[email protected]", "src\\files\\s3.keytab");
            /**
             * 验证通过后即可访问hadoop集群
             */
            //创建一个文件系统实例
            FileSystem fileSystem = FileSystem.get(conf);
            /**
             * 判断hdfs中指定目录是否存在
             */
            System.out.println(fileSystem.exists(new Path("/home/hbase")));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

    }

}

注意:其中使用的principal和keytab都是kerberos管理员创建好后给到开发人员的。

你可能感兴趣的:(java应用访问开启了kerberos验证的HDFS集群)