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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled6</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.5.2</version>
        </dependency>
    </dependencies>
</project>

访问不开启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/hdp26.bigdata.cn@HADOOP.COM");
        /**
         * 访问hadoop集群的principal
         */
        conf.set("kerberos.principal", "s3/hdp28.bigdata.cn@HADOOP.COM");
        /**
         * 访问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/hdp28.bigdata.cn@HADOOP.COM", "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管理员创建好后给到开发人员的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。