IDEA连接kerberos环境的HDFS集群报错整理

本文整理了使用IDEA连接配置了Kerberos的HDFS集群时遇到的时钟偏差和RPC保护配置不一致的错误。通过调整Windows系统时间与集群时间同步,以及确保`hadoop.rpc.protection`配置与集群一致,成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连接hdfs代码

public class HdfsTest {
    public static void main(String[] args) throws IOException {
        System.setProperty("java.security.krb5.conf", "hdfs-conf-kerberos\\krb5.conf");
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://bigdata-37-201:8020");
        conf.set("hadoop.security.authentication", "kerberos");

        try {
            UserGroupInformation.setConfiguration(conf);
            UserGroupInformation.loginUserFromKeytab("hdfs_test1/hdfs_test1@HADOOP.COM", "hdfs-conf-kerberos\\hdfs_test1.keytab");
            System.out.println("+++++++++++++="+UserGroupInformation.getCurrentUser());
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileSystem fs = FileSystem.get(conf);
        FileStatus[] fsStatus = fs.listStatus(new Path("/tmp"));
        for (int i = 0; i < fsStatus.length; i++) {
            System.out.println("+++++ "+fsStatus[i].getPath().toString());
        }
    }
}

配置文件放置路径:

报错内容:

2021-02-18 15:33:50,189 INFO [org.apache.hadoop.security.UserGroupInformation] - Login successful for user hdfs_test1/hdfs_test1@HADOOP.COM using keytab file hdfs-conf-kerberos\hdfs_test1.keytab
+++++++++++++=hdfs_test1/hdfs_test1@HADOOP.COM (auth:KERBEROS)
2021-02-18 15:34:17,628 WARN [org.apache.hadoop.ipc.Client] - Couldn't setup connection for hdfs_test1/hdfs_test1@HADOOP.COM to bigdata-37-201/192.168.37.201:8020
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)]
	at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
	at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:408)
	at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:613)
	at org.apache.hadoop.ipc.Client$Connection.access$2200(Client.java:409)
	at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:798)
	at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:794)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1962)
	at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:794)
	at org.apache.hadoop.ipc.Client$Connection.access$3500(Client.java:409)
	at org.apache.hadoop.ipc.Client.getConnection(Client.java:1552)
	at org.apache.hadoop.ipc.Client.call(Client.java:1383)
	at org.apache.hadoop.ipc.Client.call(Client.java:1347)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:228)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
	at com.sun.proxy.$Proxy11.getListing(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getListing(ClientNamenodeProtocolTranslatorPB.java:653)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:422)
	at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:165)
	at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:157)
	at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:359)
	at com.sun.proxy.$Proxy12.getListing(Unknown Source)
	at org.apache.hadoop.hdfs.DFSClient.listPaths(DFSClient.java:1678)
	at org.apache.hadoop.hdfs.DFSClient.listPaths(DFSClient.java:1662)
	at org.apache.hadoop.hdfs.DistributedFileSystem.listStatusInternal(DistributedFileSystem.java:977)
	at org.apache.hadoop.hdfs.DistributedFileSystem.access$1000(DistributedFileSystem.java:118)
	at org.apache.hadoop.hdfs.DistributedFileSystem$24.doCall(DistributedFileSystem.java:1041)
	at org.apache.hadoop.hdfs.DistributedFileSystem$24.doCall(DistributedFileSystem.java:1038)
	at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
	at org.apache.hadoop.hdfs.DistributedFileSystem.listStatus(DistributedFileSystem.java:1048)
	at com.hdfs.krb6.HdfsTest.main(HdfsTest.java:35)
Caused by: GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)
	at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:770)
	at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:248)
	at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
	at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
	... 36 more
Caused by: KrbException: Clock skew too great (37) - PROCESS_TGS
	at sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:73)
	at sun.security.krb5.KrbTgsReq.getReply(KrbTgsReq.java:251)
	at sun.security.krb5.KrbTgsReq.sendAndGetCreds(KrbTgsReq.java:262)
	at sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:308)
	at sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:126)
	at sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:458)
	at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:693)
	... 39 more
Caused by: KrbException: Identifier doesn't match expected value (906)
	at sun.security.krb5.internal.KDCRep.init(KDCRep.java:140)
	at sun.security.krb5.internal.TGSRep.init(TGSRep.java:65)
	at sun.security.krb5.internal.TGSRep.<init>(TGSRep.java:60)
	at sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:55)
	... 45 more
Exception in thread "main" java.io.IOException: Failed on local exception: java.io.IOException: Couldn't setup connection for hdfs_test1/hdfs_test1@HADOOP.COM to bigdata-37-201/192.168.37.201:8020; Host Details : local host is: "WB20200528/172.16.137.39"; destination host is: "bigdata-37-201":8020; 
	at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:808)
	at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1495)
	at org.apache.hadoop.ipc.Client.call(Client.java:1437)
	at org.apache.hadoop.ipc.Client.call(Client.java:1347)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:228)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
	at com.sun.proxy.$Proxy11.getListing(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getListing(ClientNamenodeProtocolTranslatorPB.java:653)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

错误日志分析一

2021-02-18 15:34:17,628 WARN [org.apache.hadoop.ipc.Client] - Couldn't setup connection for hdfs_test1/hdfs_test1@HADOOP.COM to bigdata-37-201/192.168.37.201:8020
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)]

Clock skew too great 时钟偏差太大

查找一下windows的时间和集群的时间,发现还真的相差半小时,修改windows的时间和集群时间同步再次执行上面代码

显示结果和在shell下查询相同

错误日志分析二

Exception in thread "main" java.io.IOException: Failed on local exception: java.io.IOException: Couldn't setup connection for hdfs_test1/hdfs_test1@HADOOP.COM to bigdata-37-201/192.168.37.201:8020; Host Details : local host is: "WB20200528/172.16.137.39"; destination host is: "bigdata-37-201":8020;

注意: hadoop.rpc.protection必须与集群的配置保持一致(core-site.xml)

conf.set("hadoop.rpc.protection", "authentication"); 

//conf.set("hadoop.rpc.protection", "privacy");

参考链接https://blog.csdn.net/zhouyuanlinli/article/details/78581510

 

<think>嗯,用户问的是如何在IntelliJ IDEA连接HDFS。首先,我需要回忆一下相关的步骤。可能涉及到配置Hadoop的依赖,或者使用插件之类的。首先,用户可能需要安装Hadoop的客户端库,或者添加相关的依赖到项目里。我记得在Java项目里,通常需要引入hadoop-client这样的依赖,然后通过FileSystem API来连接HDFS。 接下来,用户可能需要配置core-site.xml和hdfs-site.xml,这些配置文件包含了HDFS的地址和端口信息,比如fs.defaultFS。这时候,用户需要确认他们的Hadoop集群的地址是否正确,是否有权限访问。如果是远程集群,可能需要网络可达,或者设置代理。 然后,用户可能会遇到权限问题,比如访问HDFS时出现权限被拒绝的错误。这时候需要检查Hadoop集群的权限设置,或者在代码中设置用户身份,比如使用UserGroupInformation或者System.setProperty("HADOOP_USER_NAME", "user")。 另外,可能有些用户更倾向于使用插件,比如Big Data Tools插件,这样可以图形化地操作HDFS,不需要写代码。这时候需要指导他们如何安装插件,配置连接信息,比如HDFS的地址和端口,以及认证方式,比如简单认证或者Kerberos。 还有可能用户的环境问题,比如Windows下需要winutils.exe和hadoop.dll,否则会报错。这时候需要提醒用户下载这些文件并配置环境变量HADOOP_HOME。 还有版本兼容性问题,Hadoop客户端版本和集群版本是否一致,否则可能会有不兼容的情况出现,导致连接失败。需要建议用户检查版本,并尽量保持一致。 另外,用户可能想通过代码示例来连接,这时候需要给出一个简单的Java示例,展示如何获取FileSystem实例,并测试连接是否成功。同时提醒异常处理,比如捕获IOException,处理连接超时等情况。 还需要考虑安全性,如果集群启用了Kerberos认证,那么配置会更复杂,需要用到UserGroupInformation的loginUserFromKeytab方法,或者配置krb5.conf和keytab文件的位置。这时候可能需要分情况说明,或者建议用户查阅更详细的安全认证文档。 总结下来,回答应该分步骤,先讲添加依赖,再讲配置文件,然后代码示例,接着可能的问题排查,比如权限、环境变量、版本兼容性,最后提到使用插件的方法作为另一种选择。这样用户可以根据自己的情况选择合适的方式。</think>在 IntelliJ IDEA连接 HDFS 的步骤如下: --- ### 一、环境准备 1. **Hadoop 依赖配置** 在项目的 `pom.xml` 中添加 Hadoop 客户端依赖(以 Maven 为例): ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.6</version> <!-- 需与 Hadoop 集群版本一致 --> </dependency> ``` 2. **Hadoop 配置文件** 将 Hadoop 集群的 `core-site.xml` 和 `hdfs-site.xml` 复制到项目的 `resources` 目录下,确保包含以下关键配置: ```xml <!-- core-site.xml --> <property> <name>fs.defaultFS</name> <value>hdfs://namenode-host:8020</value> </property> ``` --- ### 二、代码连接 HDFS ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import java.net.URI; public class HDFSConnector { public static void main(String[] args) { try { Configuration conf = new Configuration(); // 指定 HDFS 地址 FileSystem fs = FileSystem.get(new URI("hdfs://namenode-host:8020"), conf, "hadoop-user"); // 测试连接 if (fs.exists(new Path("/"))) { System.out.println("HDFS 连接成功!"); } fs.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` --- ### 三、常见问题排查 1. **权限问题** 在代码中指定用户身份: ```java System.setProperty("HADOOP_USER_NAME", "your-username"); ``` 2. **Windows 环境问题** - 下载 `winutils.exe` 和 `hadoop.dll`(版本需匹配) - 设置环境变量: ```shell HADOOP_HOME=C:\path\to\hadoop-binaries ``` 3. **连接超时** 检查防火墙设置,确保端口 `8020`(NameNode RPC 端口)和 `9870`(Web UI)开放。 --- ### 四、通过插件连接(推荐) 1. **安装 Big Data Tools 插件** `File → Settings → Plugins` 搜索安装 "Big Data Tools" 2. **配置 HDFS 连接** - 点击右侧工具栏的 **Big Data Tools** - 选择 **HDFS** → **New Connection** - 填写参数: ``` Host: namenode-host Port: 9870 # WebHDFS 端口 User: hadoop-user ``` --- ### 五、验证连接 1. **代码验证** 运行示例代码,确认输出 `HDFS 连接成功!` 2. **插件验证** 在 Big Data Tools 界面浏览 HDFS 目录结构,上传/下载文件测试功能。 --- 通过上述步骤,可确保 IntelliJ IDEAHDFS 的稳定连接。若需 Kerberos 认证等高级配置,需额外加载 `krb5.conf` 和 `keytab` 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值