0
点赞
收藏
分享

微信扫一扫

0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群

小安子啊 2022-09-22 阅读 144

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


Fayson的github:

​​https://github.com/fayson/cdhproject​​


提示:代码块部分可以左右滑动查看噢


1

文档编写目的


做Hadoop应用开发的过程中,用户会有这样的需求,在同一个Java应用中同时访问安全和非安装的CDH集群。同一个Java应用即同一个进程同一个JVM,由于一些全局的变量可能会导致无法同时访问安全和非安全的集群。本篇文章Fayson介绍下如何使用Java代码同时访问安全和非安全的CDH集群。


  • 内容概述

1.环境准备

2.示例代码准备及运行验证

3.总结


  • 测试环境

1.RedHat7.2

2.非安全集群CDH6.1.0

3.安全集群CDH5.13.1


2

环境准备


1.分别从安全集群和非安全集群下载HDFS客户端配置,放在我们的Java工程中


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hdfs


2.在安全集群中导出一个keytab文件和krb5.conf文件至本地工程


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hadoop_02


3.在工程的pom.xml文件中添加HDFS Client依赖包


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_java_03


3

Java示例代码


在工程下创建MultipleClusterTest.java,内容如下:


package com.cloudera.hdfs.basic;

import com.cloudera.hdfs.utils.HDFSUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.security.UserGroupInformation;

import java.io.File;
import java.io.IOException;
import java.net.URI;

/**
* package: com.cloudera.hdfs.basic
* describe: Java客户端多集群访问操作(Kerberos和非Kerberos集群)
* creat_user: Fayson
* email: htechinfo@163.com
* creat_date: 2019/2/21
* creat_time: 上午10:44
* 公众号:Hadoop实操
*/
public class MultipleClusterTest {

private static String confPath = System.getProperty("user.dir") + File.separator + "hdfsdemo" + File.separator + "local-kb-conf";
private static String noconfPath = System.getProperty("user.dir") + File.separator + "hdfsdemo" + File.separator + "local-nokb-conf";

public static void main(String[] args) {
//初始化Kerberos环境HDFS Configuration 配置
Configuration configuration = HDFSUtils.initConfiguration(confPath);
configuration.set("ipc.client.fallback-to-simple-auth-allowed", "true");
initKerberosENV(configuration);

//初始化非Kerberos环境HDFS Configuration配置
Configuration noKbConf = HDFSUtils.initConfiguration(noconfPath);
try {
FileSystem fileSystem = FileSystem.get(configuration);

URI uri = FileSystem.getDefaultUri(noKbConf);
FileSystem nokbfileSystem = FileSystem.newInstance(uri, noKbConf, UserGroupInformation.getCurrentUser().getShortUserName());

//创建目录
HDFSUtils.mkdir(fileSystem, "/test");
HDFSUtils.mkdir(nokbfileSystem, "/test");

HDFSUtils.mkdir(fileSystem, "/test1");
HDFSUtils.mkdir(nokbfileSystem, "/test1");
HDFSUtils.uploadFile(nokbfileSystem, "/Users/xxx/Desktop/hue.ini", "/test");
HDFSUtils.uploadFile(fileSystem, "/Users/xxx/Desktop/hue.ini", "/test");

nokbfileSystem.close();
fileSystem.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 初始化Kerberos环境
*/
public static void initKerberosENV(Configuration conf) {
System.setProperty("java.security.krb5.conf", "/Users/xxx/Documents/develop/kerberos/local/krb5.conf");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
System.setProperty("sun.security.krb5.debug", "true");
try {
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("fayson", "/Users/xxx/Documents/develop/kerberos/local/fayson.keytab");
System.out.println(UserGroupInformation.getCurrentUser());
} catch (IOException e) {
e.printStackTrace();
}
}
}


本示例代码主要使用fayson用户访问Kerberos和非Kerberos集群,分别向两个集群的HDFS根目录下创建test、test1目录,并将本地的hue.ini文件上传至/test目录下。


4

示例代码验证


1.代码执行前两个集群HDFS显示

非安全集群显示如下:


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hdfs_04


安全集群显示如下:


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hadoop_05


2.在Intellij中直接运行示例代码


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hdfs_06


3.查看两个集群HDFS显示

非安全集群显示如下:


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hadoop_07


安全集群显示如下:


0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_java_08


可以看到在同一个Java应用同一个进程同一个JVM中,同时向安全和非安全集群成功的访问HDFS。


5

总结


1.在Java客户端同时访问安全和非安全集群时,由于一些全局的配置会造成整个JVM处于一个安全环境的客户端状态。


2.Java加载了Kerberos环境后整个JVM处于安全模式下,因此在访问非安全集群的时候会提示“Server asks us to fall back to SIMPLE auth, but this client is configured to only allow secure connections”


3.在访问Kerberos环境的Configuration中增加ipc.client.fallback-to-simple-auth-allowed为true的配置表示允许客户端使用简单认证模式。


思考:如果访问的是两个安全集群该怎么办? UserGroupInformation是一个全局的,会导致两个安全集群的使用同一个认证,如果两个集群使用同一个KDC则没有问题,使用不同的KDC则怎么处理?


GitHub地址:

​​https://github.com/fayson/cdhproject/blob/master/hdfsdemo/src/main/java/com/cloudera/hdfs/basic/MultipleClusterTest.java​​


提示:代码块部分可以左右滑动查看噢


为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群_hdfs_09

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操


举报

相关推荐

0 条评论