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

2019-11-28 21:16:26 浏览数 (1)

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

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实操

0 人点赞