使用RPC从Java连接到启用HA的HDFS时,ServiceName被忽略

使用RPC从Java连接到启用HA的HDFS时,ServiceName被忽略,java,hadoop,hdfs,Java,Hadoop,Hdfs,这是我的构建配置方法 private Configuration buildConfiguration() { Configuration conf = new Configuration(); if (connectivityDetail.isSecureMode()) { conf.set("hadoop.security.authentication", "kerberos"); conf.set("hado

这是我的构建配置方法

private Configuration buildConfiguration() {
        Configuration conf = new Configuration();

        if (connectivityDetail.isSecureMode()) {
            conf.set("hadoop.security.authentication", "kerberos");
            conf.set("hadoop.http.authentication.type", "kerberos");
            conf.set("dfs.namenode.kerberos.principal", connectivityDetail.getHdfsServicePrincipal());
        }

        if (isHAEnabled()) {
            String hdfsServiceName = connectivityDetail.getHdfsServiceName();

            conf.set("fs.defaultFS", "hdfs://" + hdfsServiceName);
            conf.set("dfs.ha.namenodes." + hdfsServiceName, "nn0,nn1");
            conf.set("dfs.nameservices", hdfsServiceName);
            conf.set("dfs.client.failover.proxy.provider." + hdfsServiceName,
                    "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
            conf.set("dfs.namenode.rpc-address." + hdfsServiceName + ".nn1",
                    connectivityDetail.getNameNodeUris().get(0));
            conf.set("dfs.namenode.rpc-address." + hdfsServiceName + ".nn0",
                    connectivityDetail.getNameNodeUris().get(1));
        }
        return conf;

    } 
在配置对象中错误地设置了hdfsService名称,但我能够获取文件系统,并且一切正常运行。我不知道为什么它不使用服务名称

这就是我创建路径的方式

public static Path getHdfsResourceLocation(String resourceLocation) throws Exception {
         String[] hdfsURIs = OrchestrationConfigUtil.getHdfsUri();
         Path hdfsResourceLoc = null;
         if (isHAEnabled()) {
             hdfsResourceLoc = new Path(resourceLocation);
         } else {
             hdfsResourceLoc = FileContext.getFileContext(new URI(hdfsURIs[0])).makeQualified(new Path(resourceLocation));
         }
         return hdfsResourceLoc;
     }

使用错误的服务名称一切正常,我不知道为什么?

没有“错误”的服务名称。它只是一个用于指向适当属性的任意标签。只要您在conf中一致地使用相同的标签,那么您的
文件系统
将能够解析活动NameNode的IP:port和basta。剩下的只是低级的TCP通信。@SamsonScharfrichter我认为这是正确的答案,但我找不到任何文档/参考。你能否提供一些参考来澄清?谢谢。只要看一下HDFS“default”配置的Apache文档,其中EXAMPLENAMESERVICE只是任意标签的占位符。非常感谢您提出这个问题。它回答了我几个小时来一直在苦苦挣扎的问题。没有“错误”的服务名称。它只是一个用于指向适当属性的任意标签。只要您在conf中一致地使用相同的标签,那么您的
文件系统
将能够解析活动NameNode的IP:port和basta。剩下的只是低级的TCP通信。@SamsonScharfrichter我认为这是正确的答案,但我找不到任何文档/参考。你能否提供一些参考来澄清?谢谢。只要看一下HDFS“default”配置的Apache文档,其中EXAMPLENAMESERVICE只是任意标签的占位符。非常感谢您提出这个问题。它回答了我苦苦挣扎了几个小时的问题。