hadoop kerberos java_hadoop kerberos认证
更新时间:2018/11/9 11:35:53
更新内容:
1. 将
以下正文:
最近做一个项目涉及到读取hdfs数据时要进行kerberos认证,上网找了挺多例子试了挺久才成功,项目完成了这里记录一下。因为时间过去挺久忘了当初是参考哪个博文验证成功的了,虽无法指明但表示感谢!
kerberos认证
这里是用keytab和krb5.conf文件进行kerberos认证,至于这两个文件是干嘛的自行搜索(其实我也不太清除o.o,就是用来验证Kerberos的了)。需要的相关信息配置在hdfs_info.properties文件中,配置如下:
## namenode的地址,hdfs://ip:port
hdfs_address=
## .keytab文件路径
key_tab_path=
## krb5.conf文件路径
krb5_path=
## hdfs-site.xml文件路径
hdfs_site_path=
## kerberos认证用户
login_user=
这里我只是列出了需要配置的内容,相关信息配置成自己集群环境的信息就好,hdfs-site.xml中主要是需要dfs.namenode.kerberos.principal和dfs.datanode.kerberos.principa这两个配置信息,如果不想将整个配置文件导入(里面配置了很多信息)也可以直接conf里面设置即可:
// ""中填写对应配置的值
conf.set("dfs.namenode.kerberos.principal","");
conf.set("dfs.datanode.kerberos.principal","");
然后Kerberos认证的类HdfsUtil.class中进行认证的方法kerberosCertify(),我将返回值由原来的void改为了Configuraiton,是想到kerberos认证是有过期时间的,不知道conf存储了认证信息,过期后是否需要重新认证,如果需要重新认证这样会方便写,且加个定时器定时去定时认证会更好,避免手动调用。如果不会过期那就还是void好点,且Configuration最好做单例处理,此处待确认和优化,具体代码如下:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.security.UserGroupInformation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cdc.common.util.PropertiesUtil;
import com.cdc.hdfs.enums.FilePermissionEnum;
import com.cdc.hdfs.enums.FileTypeEnum;
/**
*@author lshua
*@time 2018年6月27日
*@description: 集群工具类
*/
public class HDFSUtil {
private static final Logger log = LoggerFactory.getLogger(HDFSUtil.class);
/**
* hdfs信息配置文件路径 resources目录下
*/
private static final String HDFS_INFO_ADDRESS = "hdfs_info.properties";
/**
* hdfs配置信息
*/
private static Map proMap = PropertiesUtil.getProperties(HDFS_INFO_ADDRESS);
/**
* HDFS namenode地址
*/
private static final String HDFS_ADDRESS = proMap.get("hdfs_address");
/**
* 认证需要的.keytab文件的路径
*/
private static final String KEY_TAB_PATH = proMap.get("key_tab_path");
/**
* 配置文件krb5.conf的路径
*/
private static final String KRB5_PATH = proMap.get("krb5_path");
/**
* hdfs-site.xml文件的路径
*/
private static final String HDFS_SITE_PATH = proMap.get("hdfs_site_path");
/**
* kerberos认证用户名
*/
private static final String LOGIN_USER = proMap.get("login_user");
/**
* 配置信息
*/
private static Configuration conf = null;
/**
* 对集群进行认证操作
*
*@return Configuration 返回包含认证信息的,失败返回null
*@date 2018年11月2日
*/
public static Configuration kerberosCertify() {
conf = new Configuration();
// 设置kerberos配置信息
System.setProperty("java.security.krb5.conf", KRB5_PATH);
conf.set("fs.defaultFS", HDFS_ADDRESS);
conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());
conf.set("fs.file.impl", LocalFileSystem.class.getName());
/**
* 启用kerberos认证
*/
conf.setBoolean("hadoop.security.authentication", true);
conf.set("hadoop.security.authentication", "kerberos");
// 添加hdfs-site.xml的内容
conf.addResource(new Path(HDFS_SITE_PATH));
UserGroupInformation.setConfiguration(conf);
try {
// kerberos认证
UserGroupInformation.loginUserFromKeytab(LOGIN_USER, KEY_TAB_PATH);
UserGroupInformation.getLoginUser();
} catch (Exception e) {
log.error("------------hdfs kerberos 认证异常!--------------");
e.printStackTrace();
return null;
}
return conf;
}
代码中用到了一个自己写的PropertiesUtil.class工具类代码如下 :
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*@author lshua
*@time 2018年4月24日
*@description: 配置文件的工具类
*/
public class PropertiesUtil {
private static Logger log = LoggerFactory.getLogger(PropertiesUtil.class);
/**
*@description 根据文件路径获取配置信息
*@param confPath 配置文件路径
*@return Map
*@author lshua
*@date 2018年5月4日
*/
public static Map getProperties(String confPath) {
log.info("-----loadConfig()... begin-----");
log.info("-----confPath = {}", confPath);
Map proMap = new HashMap(32);
Properties prop = new Properties();
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(new File(confPath));
bis = new BufferedInputStream(fis);
prop.load(bis);
Set> propSet = prop.entrySet();
for(Entry entry : propSet) {
proMap.put(entry.getKey().toString(), entry.getValue().toString());
}
} catch (Exception e) {
e.printStackTrace();
log.info("-----loadConf() error-----");
} finally {
try {
if(bis != null) {
bis.close(); bis = null;
}
if(fis != null) {
fis.close(); fis = null;
}
} catch (Exception e) {
log.info("------ close io stream error ! -----");
e.printStackTrace();
}
}
log.info("-----loadConfig()... end-----");
return proMap;
}
}
需要注意的是因为开启的kerberos认证,所以当其他地方需要做hdfs的相关操作的时候不能直接new 一个Configuration出来,需要使用这里进行了kerberos验证包含验证信息的Configuration,所以开发一个接口给其他代码获取就好:
/**
* 获取进行了kerberos认证的configuration
*
*@return Configuration
*@author lshua
*@date 2018年7月27日
*/
public static Configuration getConfiguration() {
return conf;
}
代码在项目中已经验证通过了的,这里就不贴测试的代码了。配置正常应该是能正常使用的,最后附上相关的jar包gradle依赖:
// hadoop相关依赖,编译时需要。
compileOnly('org.apache.hadoop:hadoop-common:2.6.0')
compileOnly('org.apache.hadoop:hadoop-hdfs:2.6.0')
// 日志
compile 'org.slf4j:slf4j-api:1.7.12'
compile 'log4j:log4j:1.2.17'
emmmmmm有时候还要环境数据,大概说一下:
* jdk 1.7
* eclipse 4.7.2
* gradle 4.4.10
* CDH5.8.3-hadoop2.6.0
hadoop kerberos java_hadoop kerberos认证相关推荐
- 配置两个Hadoop集群Kerberos认证跨域互信(两个集群互通)
配置两个Hadoop集群Kerberos认证跨域互信 两个Hadoop集群开启Kerberos验证后,集群间不能够相互访问,需要实现Kerberos之间的互信,使用Hadoop集群A的客户端访问Had ...
- hadoop生态的kerberos认证系列2-hadoop
hadoop生态的kerberos认证系列2-hadoop 一.准备工作 二.配置 1.hdfs配置kerberos认证 1.1所有节点安装autoconf 1.2所有节点安装gcc 1.3安装jsv ...
- Hadoop安全之Kerberos
简介 安全无小事,我们常常要为了预防安全问题而付出大量的代价.虽然小区楼道里面的灭火器.消防栓常年没人用,但是我们还是要准备着.我们之所以愿意为了这些小概率事件而付出巨大的成本,是因为安全问题一旦发生 ...
- 集成OpenLDAP与Kerberos实现统一认证(一):整合后台数据库
文章目录 1. 写作背景 2. 既定目标 3. 环境说明 4. 安装操作 4.1 安装OpenLDAP 4.1.1 安装软件包 4.1.2 启动服务 4.1.3 初始化 4.1.4 禁止匿名访问 4. ...
- 集成OpenLDAP与Kerberos实现统一认证(三):基于SASL/GSSAPI深度集成
文章目录 1. 写作背景 2. 既定目标 3. 重要概念 3.1 SASL 3.2 GSSAPI 3.3 SASL与GSSAPI的关系 3.4 saslauthd 3.5 Kerberos化 4. 核 ...
- kerberos java_[Kerberos] Java client访问kerberos-secured cluste
使用java client访问kerberos-secured cluster,最重要的是先从admin那里拿到可用的keytab文件,用来作认证.接下来就是调整连接的配置问题.以下先用连接hdfs为 ...
- 报错:Ticket expired while renewing credentials 原因:Hue 集成Kerberos 导致Kerberos Ticket Renewer 起不来
报错:Ticket expired while renewing credentials 原因:Hue 集成Kerberos 导致Kerberos Ticket Renewer 起不来 图片: 报错, ...
- Kerberos (一) --------- Kerberos 部署
目录 一.Kerberos 概述 1. 什么是 Kerberos 2. Kerberos 术语 3. Kerberos 认证原理 二.Kerberos 安装 1. 安装 Kerberos 相关服务 2 ...
- hadoop KerberosUtil 做Kerberos认证
网上找了一下,自己写了个KerberosUtil工具类,测试过可以用. 注意这个不是 org.apache.hadoop.security.authentication.util.KerberosUt ...
- 【kerberos】kerberos 认证 详情介绍
文章目录 1.概述 2.简单认证 2.详细认证 1.概述 本文章是视频:Kerberos认证详解 笔记. Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoo ...
最新文章
- HarmonyOS之常用组件ToastDialog的功能和使用
- java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...
- Volcano 监控设计解读,一看就懂
- 四张图,读懂 BIO、NIO、AIO、多路复用 IO 的区别
- 小工厂规章制度_小工厂的规章制度(共8篇).doc
- 联想计算机Lenovo ThinkCentre M910t-NO76的重装
- w3cschool菜鸟教程php,JS实例学习笔记——w3cschool+菜鸟教程
- 浅谈进销存管理-【采购篇】
- java命令行打包war_手工命令行打包java工程为war包
- android 安装界面关闭程序,Android安装apk文件,不弹出安装完成的界面
- OSChina 周四乱弹 ——士可杀不可辱,这句话用英语怎么说?
- python+Selenium自动化操作Chrome模拟手机浏览器
- List和Map集合遍历的3种方式
- v-if 和 v-show的区别 vue面试题
- spring boot 配置Filter过滤器
- 【迅为iMX6Q】开发板烧写Uboot后串口无任何输出的问题解决
- 【总结】最全1.5万字长文解读7大方向人脸数据集v2.0版,搞计算机视觉怎能不懂人脸...
- 笔记本计算机提升性能,笔记本电脑越来越卡?教你如何有效的提升性能-笔记本电脑卡怎么办...
- Linux C 以read()读取文件并提取字符串
- 00后确实卷,公司新来的卷王,我们这帮老油条真干不过...