热门标签 | 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;}
}

 


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


推荐阅读
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • MR程序的几种提交运行模式本地模型运行1在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行-- ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
  • Zookeeper 总结与面试题汇总
    Zookeeper总结与面试题汇总,Go语言社区,Golang程序员人脉社 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
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社区 版权所有