一般情况下,我们想要使用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管理员创建好后给到开发人员的。