- 一、项目pom依赖配置
- 二、Java访问代码
- 三、实现截图
- 四、遇到错误
- 五、总结
前几天搭建了Kerberos认证的HDFS文件系统,今天打算写文章来介绍一下,用Java来访问经过Kerberos加密的HDFS文件系统,在这之前,需要在KDC生成keytab文件,然后把/etc/krb5.conf文件下载,并且放到项目中。
一、项目pom依赖配置二、Java访问代码org.apache.hadoop hadoop-common2.6.0 org.apache.hadoop hadoop-hdfs2.6.0
import java.security.PrivilegedExceptionAction; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.security.UserGroupInformation; public class HDFSKerberos { public static void main(String[] args) throws Exception { String principal = "hdfs"; //Kerberos Principal,如果不然REALM,则使用krb5.conf默认的 String keytabFile = "src/main/resources/hdfs.keytab"; //KDC生成的keytab文件 Configuration conf = new Configuration(); conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); conf.set("fs.defaultFS", "hdfs://hadoop60:8020"); //HDFS地址 //需要设置krb5.conf文件 System.setProperty("java.security.krb5.conf", "src/main/resources/krb5.conf"); UserGroupInformation.loginUserFromKeytab(principal, keytabFile); UserGroupInformation ugi = UserGroupInformation.getLoginUser(); //使用UserGroupInformation来获FileSystem FileSystem fs = ugi.doAs(new PrivilegedExceptionAction三、实现截图 四、遇到错误() { @Override public FileSystem run() throws Exception { return FileSystem.get(conf); } }); FileStatus[] fileStatus = fs.listStatus(new Path("/")); for (FileStatus fst : fileStatus) { System.out.println(fst.getPath()); } } }
1.Can't get Kerberos realm
这是因为没有加载Kerberos的配置文件引起的,解决方法,把KDC服务器的/etc/krb5.conf下载配置即可
五、总结Java在访问Kerberos认证系统的HDFS时,需要用principal,和生成的keytab文件,然后生成UserGroupInformation对象,保存生成的Ticket,但是每次登陆的时候需要用到UserGroupInformation,但有时不需要也可以,因为UserGroupInformation中的Subject对象是绑定在当前的线程中,若不是同一个线程,则每次都需要重新登陆,但是通过UserGroupInformation.doAs方法,它在验证的时候,会切换线判断是否登陆。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)