Java访问kerberos认证的HDFS文件
程序员文章站
2022-03-02 08:11:41
...
Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。
具体HADOOP的访问HDFS使用Kerberos的作用和原理请自己查阅相关文档。
之前做项目时第一次使用Kbs访问HDFS,当时不了解,翻阅资料搞了好久,也入了不少坑,现分享出来,方便大家。
下面代码在项目亲测过,可用
代码如下:
package zqmKerberos;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;
import org.apache.hadoop.fs.Path;
public class BjKerberos {
public final String USER_KEY = "[email protected]"; //用户key
public final String KEY_TAB_PATH = "/home/usergrp.user-app_yxkj.keytab"; //keytab文件
public final String HDFS_PATH = "/user/finalRes"; //要访问的HDFS路径
public HashMap<String,String> map = new HashMap<String,String>();
public HashMap<String,String> Kerberos() throws IOException {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
String currentDay = df.format(new Date());
// HDFS的Kerberos认证
System.setProperty("java.security.krb5.conf", "/home/krb5.conf");
Configuration conf = new Configuration();
// 必须加,不然会报找不到文件系统
conf.addResource(new Path("/home/hdfs-site.xml"));
conf.addResource(new Path("/home/core-site.xml"));
// 设置conf信息
conf.setBoolean("hadoop.security.authorization", true);
conf.set("hadoop.security.authentication", "kerberos");
try {
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab(USER_KEY, KEY_TAB_PATH);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Kerberos Checked Finsh! Get HDFS Data ! \n");
// 下面是自己的业务逻辑,不用看
FileSystem fs = FileSystem.get(conf);
FileStatus dir[] = fs.listStatus(new Path(HDFS_PATH));
for (int i = 0; i < dir.length; i++) {
FileStatus dir_two[] = fs.listStatus(dir[i].getPath());
for (int j = 0; j < dir_two.length; j++) {
if(dir_two[j].getPath().toString().contains(currentDay)){
FileStatus files[] = fs.listStatus(dir_two[j].getPath());
for(int n = 0; n < files.length; n++){
// 结果数据文件
System.out.println(files[n].getPath());
InputStream in = fs.open(files[n].getPath());
BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String line = null;
while ((line = br.readLine()) != null) {
String str[] = line.split("\t");
// 因为一个标识会被多人呼,所以加UUID使其唯一
map.put(str[0].trim() + "_" + UUID.randomUUID(), str[1].trim());
}
}
}
}
}
System.out.printf("HDFS Data Total number:%d (tiao)\n", map.size());
for (String key : map.keySet()) {
System.out.printf("Show first sample data: " + key + "\t" + map.get(key) + "\n");
break;
}
return map;
}
}
hdfs-site.xml,core-site.xml:这两个文件是集群配置文件,具体再哪里?自己咨询集群维护人员,切记必须要有。
上一篇: spring boot 启动报错Protocol handler start failed
下一篇: Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 224; 元素内容必须由格式正确的字符数据或标记组成
推荐阅读
-
使用Java7的Files工具类和Path接口来访问文件的方法
-
HDFS的Java API的访问方式实例代码
-
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
-
Java程序中不通过hadoop jar的方式访问hdfs
-
java路径问题:springboot的前段静态资源路径、java后端读取文件路径、直接访问html
-
java web项目中WEB-INF目录下的.jsp文件无法访问其他页面的内容
-
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
-
MongoDB的Java访问实现(包括文件存储)
-
利用IBM Java Toolbox for i实现针对数据库文件的记录级访问
-
java实现对hadoop hdfs的基本目录和文件操作