前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群

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

作者头像
Fayson
发布2019-11-28 21:16:26
1.6K0
发布2019-11-28 21:16:26
举报
文章被收录于专栏:Hadoop实操

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档