温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
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工程中
2.在安全集群中导出一个keytab文件和krb5.conf文件至本地工程
3.在工程的pom.xml文件中添加HDFS Client依赖包
3
Java示例代码
在工程下创建MultipleClusterTest.java,内容如下:
代码语言:javascript复制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显示
非安全集群显示如下:
安全集群显示如下:
2.在Intellij中直接运行示例代码
3.查看两个集群HDFS显示
非安全集群显示如下:
安全集群显示如下:
可以看到在同一个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干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操