热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kettle中添加Kerberos认证

目录一、背景介绍二、涉及kerberos认证的步骤1、JS下载文件2、JS重命名HDFS文件3、文件移动三、代码1、编写类HDFSProcess2、编写类HDFSUti

 目录

一、背景介绍 

二、涉及kerberos 认证的步骤

 1、JS 下载文件 

 2、JS 重命名HDFS文件

3、文件移动

三、代码

1、编写类HDFSProcess

2、编写类HDFSUtil

3、编写类 KettleKerberosUtils

4、编写类KerberosUtil

5、编写工具类PropertyUtils




一、背景介绍 


在 这篇使用 Kettle解析HDFS文件 同步到数据库文章中 Kettle实现 HDFS文件解析同步到SQLServer数据库(ETL 包括:时间格式化、IP校验、字段拼接)_开着拖拉机回家的博客-CSDN博客_hdfs同步数据库,重点讲了 作业的设计思路 和 Kettle中 用到的组件,在最终将作业设计完成之后做了Kerberos认证,不让HDFS裸奔。



Kerberos客户端支持两种认证方式,一是使用 principal + Password,二是使用 principal + keytab,前者适合用户进行交互式应用,例如hadoop fs -ls这种,后者适合服务,例如yarn的rm、nm等

 对于 HDFS的访问认证,我们使用了 principal + keytab



二、涉及kerberos 认证的步骤


 1、JS 下载文件 


此处的JS 代码 需要添加Kerberos认证的代码,在完成  Kerberos 认证之后 就可以下载 HDFS文件到本地了。



代码里面的文件目录随便写的


// HDFS 目录文件下要匹配的文件
var regexFile="^DataServerCloud\\.*.*[0-9]{12}\\.txt\\.*[0-9]{13}$"; // HDFS文件目录
var srcFloder="/hadoop/org/ReportInfo/"; // 下载到 linux 本地文件
var targetFloder="/hadoop/software/download_tmp/";// 要认证的主体
var user = "hdfs-kanna@kanna.COM";// 主体生成密钥文件 命令实现 kadmin.local -q "xst -k /etc/security/keytabs/kang.keytab kang@WINNER.COM"
var keytab = "/etc/security/keytabs/hdfs.headless.keytab";// KDC admin_server 的配置信息
var krb5 = "/etc/krb5.conf"// Kerberos 工具类 后面 会有代码
pp = new com.dataplat.utils.KettleKerberosUtils(user,keytab,krb5);// 调用具体的方法 完成认证
pp.auth();// 文件下载
var re = new Packages.com.kangna.datacenter.hdfs.HdfsProcess(regexFile,srcFloder,targetFloder);re.downloadFile();true;

 2、JS 重命名HDFS文件


跟前面 JS 下载 HDFS文件  基本一样 ,这块多了一个 封装的 rename 方法,代码后面有



3、文件移动


kinit -kt 就是使用生成的密钥文件对 实例进行认证



kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs-kangna@kangna.COM
hadoop fs -mv /hadoop/org/Report/*.completed /hadoop/org/Report_bak/

三、代码


1、编写类HDFSProcess


此类主要实现是 HDFS 文件下载到本地,还有文件的重命名。


package com.kangna.hdfs;import com.google.common.collect.Sets;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;/*** @AUTHOR kangll* @DATE 2020/6/20 10:16* @DESC: HDFS 工具类*/
public class HDFSProcess {private static final Logger logger = LoggerFactory.getLogger(HDFSProcess.class);private String regex;private String srcHDFSFolder;private String destinationFolder;private FileSystem fileSystem;public HDFSProcess() {}public HDFSProcess(String regex, String srcHDFSFolder, String destinationFolder) {this.regex = regex.toLowerCase();this.srcHDFSFolder = srcHDFSFolder;this.destinatiOnFolder= destinationFolder;}/*** 下载文件到本地*/public void downloadFile() throws Exception {// 提供配置参数对象Configuration cOnf= new Configuration();// 获取文件的状态List

paths = HDFSUtil.listStatus(conf, this.srcHDFSFolder, this.regex);logger.info("HDFS matched " + paths.size() + " files");for (Path path : paths) {String fileName = path.getName();fileSystem = FileSystem.get(conf);// 比如: /hadoop/kangna/odsPath srcPath = new Path(this.srcHDFSFolder + File.separator + fileName);// 比如:G:\\API\\String localPath = this.destinationFolder + File.separator + fileName;FSDataInputStream dataInputStream = fileSystem.open(srcPath);BufferedReader reader = new BufferedReader(new InputStreamReader(dataInputStream));BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(localPath)));String line = null;while ((line = reader.readLine()) != null) {writer.write(line + "\n");}reader.close();writer.close();}logger.info("download file successful.");}/*** 文件重命名** @param localPath 本地文件路径* @param HDFSPath HDFS文件路径* @param suffix 后缀*/public void rename(String localPath, String HDFSPath, String suffix) throws Exception{Configuration cOnf= new Configuration();// 获取本地文件名的集合Set fileNameList = getFileLocalName(localPath);logger.info("match local file size : " + fileNameList.size());System.out.println("matche local file size : " + fileNameList.size());for (String fileName : fileNameList) {String src = HDFSPath + File.separator + fileName;// 比如: 将 kangna.txt 重命名 为 kangna.txt.completedString target = HDFSPath + File.separator + fileName + suffix;// 重命名 实现 调用 renameToboolean flag = HDFSUtil.renameTo(conf, src, target);if (flag) {System.out.println("renamed file " + src + " to " + target + "successful.");} else {System.out.println("renamed file " + src + " to " + target + "failed.");}System.out.println(fileName);}}public Set getFileLocalName(String localPath) {System.out.println("listing path is : " + localPath);// 将正则编译为此类的实例Pattern pattern = Pattern.compile(this.regex);Set list = Sets.newHashSet();File baseFile = new File(localPath);if ((baseFile.isFile()) || (!baseFile.exists())) {return list;}// 返回文件的抽象路径名数组File[] files = baseFile.listFiles();System.out.println("this path has files : " + files.length);for (File file : files) {if (file.isDirectory()) {list.addAll(getFileLocalName(file.getAbsolutePath()));} else {list.add(file.getName());}}return list;}public static void main(String[] args) throws Exception {System.out.println(new HDFSProcess());}
}

2、编写类HDFSUtil


package com.kangna.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;/*** @AUTHOR kangll* @DATE 2020/6/20 10:31* @DESC:*/
public class HDFSUtil {private static final Logger logger = LoggerFactory.getLogger(HDFSUtil.class);// 文件执行中的标记private static final String FILE_EXECUTING_MARK = ".executing";// 文件执行后的标记private static final String FILE_COMPLETED_MARK = ".completed";private static FileSystem fileSystem;/*** 获取文件执行的状态** @param conf* @param dirPath* @return*/public static List

listStatus(Configuration conf, String dirPath) throws Exception {return listStatus(conf, dirPath, "");}/*** 获取文件执行的状态** @param conf 配置参数* @param dirPath 文件路径* @param regex 要匹配的正则* @return*/public static List

listStatus(Configuration conf, String dirPath, String regex) throws IOException {List

files = new ArrayList<>();try {// 返回配置过的文件系统对象fileSystem = FileSystem.get(conf);// 列出指定路径中文件的状态和块位置RemoteIterator fileStatus = fileSystem.listFiles(new Path(dirPath), true);Pattern pattern = Pattern.compile(regex);while (fileStatus.hasNext()) {LocatedFileStatus file = fileStatus.next();Path path = file.getPath();String fileName = path.getName().toLowerCase();if (regex.equals("")) {files.add(path);logger.info("match file : " + fileName);} else if (pattern.matcher(fileName).matches()) {files.add(path);logger.info("match file : " + fileName);}}} finally {if (fileSystem != null) {fileSystem.close();}}return files;}/*** 创建文件夹** @param conf* @param dir* @return*/public static boolean mkdir(Configuration conf, String dir) throws IOException {boolean flag = false;try {fileSystem.get(conf);if (fileSystem.exists(new Path(dir))) {flag = true;} else {fileSystem.mkdirs(new Path(dir));}} finally {if (fileSystem != null) {fileSystem.close();}}return flag;}/*** @param conf* @param src 要重命名的 src 路径* @param target 重新命名的 target 路径* @return* @throws Exception*/public static boolean renameTo(Configuration conf, String src, String target) throws Exception {boolean flag = false;try {fileSystem = FileSystem.get(conf);if (fileSystem.exists(new Path(target))) {fileSystem.delete(new Path(target), true);logger.info("target file : " + target + " exist, deleted");}// 将路径名 src 重命名为 路径targetflag = fileSystem.rename(new Path(src), new Path(target));if (flag) {logger.info("renamed file " + src + " to " + target + " success!");} else {logger.info("renamed file " + src + " to " + target + " failed!");}} finally {if (fileSystem != null) {fileSystem.close();}}return flag;}
}

3、编写类 KettleKerberosUtils


实例化对象传入 三个参数,就可以完成Kerberos认证


package com.kangna.kerberos;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;import java.io.IOException;/*** @AUTHOR kangll* @DATE 2020/6/27 14:07* @DESC:*/
public class KettleKerberosUtils {private String user;private String keytable;private String krb5;public KettleKerberosUtils(String user, String keytable, String krb5) {this.user = user;this.keytable = keytable;this.krb5 = krb5;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getKeytable() {return keytable;}public void setKeytable(String keytable) {this.keytable = keytable;}public String getKrb5() {return krb5;}public void setKrb5(String krb5) {this.krb5 = krb5;}/**** UserGroupInformation .Hadoop的用户和组信息。这个类封装了一个JAAS主题,并提供了确定用户用户名和组的方法。* 它同时支持Windows、Unix和Kerberos登录模块。*/public void auth() {System.out.println(this.user);Configuration cOnf= new Configuration();System.setProperty("java.security.krb5.conf", this.krb5);UserGroupInformation.setConfiguration(conf);try {/*** loginUserFromKeytab(this.user, this.keytable)* (用户要从Keytab加载的主名称,keytab文件的路径)*/UserGroupInformation.loginUserFromKeytab(this.user, this.keytable);} catch (IOException e) {e.printStackTrace();}}}

4、编写类KerberosUtil


KerberosUtil 类是使用配置文件的形式进行认证


package com.kangna.kerberos;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;import java.io.IOException;
import java.util.Properties;/*** @AUTHOR kangll* @DATE 2020/6/27 14:07* @DESC:*/
public class KerberosUtil {public static void main(String[] args) {Properties prop = PropertyUtils.loadProperty("kerberos_user.properties");String user = prop.getProperty("kerberos.hdfs.user");String keytab = prop.getProperty("kerberos.hdfs.keytab");try {authKerberos(user, keytab);Configuration cOnf= new Configuration();FileSystem fs = FileSystem.get(conf);FileStatus[] files = fs.listStatus(new Path("/winhadoop"));for (FileStatus file : files) {System.out.println(file.getPath());}} catch (Exception e) {e.printStackTrace();}}/*** Kerberos 认证* @param user* @param keytab*/public static void authKerberos(String user, String keytab) {Configuration cOnf= new Configuration();System.setProperty("java.security.krb5.conf", PropertyUtils.loadProperty("kerberos_user.properties").getProperty("kerberos.krb5.path"));try {UserGroupInformation.loginUserFromKeytab(user, keytab);} catch (IOException e) {e.printStackTrace();}}
}

5、编写工具类PropertyUtils


配置文件的获取


package com.kangna.kerberos;import org.apache.log4j.Logger;import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;/*** @AUTHOR kangll* @DATE 2020/6/27 14:47* @DESC:加载配置文件工具类*/
public class PropertyUtils {private static final Logger logger = Logger.getLogger(PropertyUtils.class);/*** 类加载根据文件名加载 配置文件* @param fileName* @param loader 类加载器* @return*/public static Properties loadPropertyFileWithClassLoader(String fileName, ClassLoader loader) {Properties prop = new Properties();URL commOnFileUrl= loader.getResource(fileName);try {prop.load(commonFileUrl.openStream());} catch (IOException e) {logger.error("Can&#39;t load configuration file : " + fileName);logger.error(e.getMessage(), e);}return prop;}/*** 根据 URL 加载配置文件* @param fileName* @return*/public static Properties loadPropertyFileWithURL(String fileName) {Properties prop = new Properties();try {prop.load(new FileInputStream(fileName));} catch (IOException e) {logger.error("Can&#39;t load configuration file : " + fileName);logger.error(e.getMessage(), e);}return prop;}/**** @param fileName* @return*/public static Properties loadProperty(String fileName) {Properties prop = new Properties();try {prop.load(ClassLoader.getSystemResourceAsStream(fileName));} catch (IOException e) {e.printStackTrace();}return prop;}
}

 


--------------------------- 感谢点赞!---------------------------------


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
奇力0_843
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有