在使用go客户端访问开启kerberos和RBAC的HDFS时无法正常读写,关闭RBAC(kerberos不关)可以正常读写,不知是否有人遇到过?

在使用go客户端(github.com/colinmarc/hdfs)访问开启kerberos和RBAC的HDFS时无法正常读写,报错与权限有关,关闭RBAC(kerberos不关)可以正常读写,不知是否有人遇到过?

1. 运行环境

使用go 版本:1.19.4
使用go库:github.com/colinmarc/hdfs
hdfs(版本:2.7.2、3.3.4):开启kerberos,开启RBAC

2. 问题描述?

在使用库github.com/colinmarc/hdfs编写的go客户端,访问开启kerberos和RBAC的HDFS时无法正常读写,报错与权限有关,关闭RBAC(kerberos不关)可以正常读写
报错信息:no available namenodes: SASL handshake: sasl call failed with FATAL_UNAUTHORIZED

kerberos认证代码片段:

func getKerberosClientWithKeytab(username, realm string, krb5ConfigPath, keytabPath string) *krb.Client {

    cfg, err := config.Load(krb5ConfigPath)
    if err != nil {
        log.Println("Couldn't load krb config:", err)
        return nil
    }
    kt, err := keytab.Load(keytabPath)
    if err != nil {
        log.Println("Couldn't load keytab:", err)
        return nil
    }

    client := krb.NewWithKeytab(username, realm, kt, cfg)
    err = client.Login()
    if err != nil {
        log.Println("Kerberos login failed: ", err)
        return nil
    } else {
        log.Println("Kerberos login success ")
    }
    return client
}

获取认证后的hdfs client代码片段:

func NewHDFSClient(username, realm string, krb5ConfigPath, krb5CCName string, nodenames []string) *HDFSClient {

    conf, err := hadoopconf.LoadFromEnvironment()
    if err != nil {
        fmt.Println("Problem loading configuration: ", err)
    }
    options := hdfs.ClientOptionsFromConf(conf)

    options.Addresses = nodenames
    options.KerberosClient = getKerberosClientWithKeytab(username, realm, krb5ConfigPath, krb5CCName)
    options.KerberosServicePrincipleName = username
    options.User = "work"

    log.Println("options.Addresses:", options.Addresses)
    log.Println("options.KerberosClient:", options.KerberosClient)
    log.Println("options.KerberosServicePrincipleName:", options.KerberosServicePrincipleName)
    log.Println("options.User:", options.User)
    client, err := hdfs.NewClient(options)

    if err != nil {
        log.Panicln("client error:", err)
    }
    hdfsClient := &HDFSClient{
        Client: client,
    }
    return hdfsClient
}

在网上调研后也没有找到相关类似信息可以解决我的这个问题,请大佬帮忙看看,感谢

3. 您期望得到的结果?

在开启kerberos和RBAC的hdfs上,go客户端可以正常读写

4. 您实际得到的结果?

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!