
某内部MRS集群Hive对接,服务器上部署了Spark,连接云端的Hive,参考的样例代码为mrs-example-mrs-3.3.0中的hive-jdbc-example,通过获取连接url,用spark.read().format("jdbc").options(xxxx)的方式;
现在报错内容是:①unable to read HiveServer2 configs from ZooKeeper
②KeeperErrorCode=Session closed because client failed to authenticate for /hiveserver2
改造的内容是hive-jdbc-example中的USER_NAME的值,usedir的路径为实际路径

从报错信息来看,核心问题集中在ZooKeeper 连接与认证失败,这通常与云端 Hive 的服务发现配置、认证机制(如 Kerberos)以及客户端参数匹配有关。
/hiveserver2)被修改,或网络不通(如防火墙阻止 ZooKeeper 端口 2181/2182)。
MRS 集群的 Hive 通常通过 ZooKeeper 实现 HiveServer2 的高可用,连接 URL 格式为:
jdbc:hive2://<zk-quorum>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;<auth-params>其中关键参数需与云端 MRS 集群一致:
<zk-quorum>:ZooKeeper 集群地址,格式为zk-node1:port,zk-node2:port(MRS 集群的 ZooKeeper 端口通常是 2181,若启用安全模式可能是 2182)。zooKeeperNamespace:HiveServer2 在 ZooKeeper 中的注册根路径(默认hiveserver2,若云端有自定义需同步修改)。<auth-params>:认证相关参数(MRS 默认启用 Kerberos,需添加 Kerberos 认证参数)。MRS 集群的 Hive 和 ZooKeeper 通常集成 Kerberos 安全认证,客户端必须通过 Kerberos 认证才能访问。需完成以下配置:
从 MRS 集群控制台下载:
krb5.conf:Kerberos 的配置文件(包含 KDC 地址、 Realm 等信息)。keytab文件(如hiveuser.keytab)和对应的principal(如hiveuser@HADOOP.COM)。将这两个文件放置在本地 Spark 服务器的可访问路径(如/etc/krb5.conf、/opt/keytabs/hiveuser.keytab)。
在spark.read.jdbc的options中添加 Kerberos 相关配置,同时确保 JVM 加载krb5.conf:
import org.apache.spark.sql.SparkSession
object HiveJdbcExample {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("Hive-JDBC-Example")
// 加载Kerberos配置
.config("spark.driver.extraJavaOptions", "-Djava.security.krb5.conf=/etc/krb5.conf")
.config("spark.executor.extraJavaOptions", "-Djava.security.krb5.conf=/etc/krb5.conf")
.getOrCreate()
// Hive JDBC连接参数
val jdbcOptions = Map(
"url" -> "jdbc:hive2://zk-node1:2181,zk-node2:2181,zk-node3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;authMech=1;principal=hive/_HOST@HADOOP.COM",
"dbtable" -> "default.t1", // 目标表
"user" -> "hiveuser", // MRS集群的Hive用户名
"password" -> "", // Kerberos认证时密码可为空,依赖keytab
"driver" -> "org.apache.hive.jdbc.HiveDriver"
)
// 若需通过keytab自动登录(避免手动kinit),可在代码中添加登录逻辑
import org.apache.hadoop.security.UserGroupInformation
UserGroupInformation.setConfiguration(spark.sparkContext.hadoopConfiguration)
UserGroupInformation.loginUserFromKeytab("hiveuser@HADOOP.COM", "/opt/keytabs/hiveuser.keytab")
// 读取Hive表
val df = spark.read.format("jdbc").options(jdbcOptions).load()
df.show()
spark.stop()
}
}telnet zk-node1 2181测试网络连通性,确保本地 Spark 服务器能访问 MRS 的 ZooKeeper 节点。/hiveserver2),需在 URL 中同步修改zooKeeperNamespace参数(如zooKeeperNamespace=custom-hiveserver2)。MRS 3.3.0 对应的 Hive 版本通常为 2.x 或 3.x,需确保本地 Spark 的依赖包与 MRS 版本兼容:
hive-jdbc、zookeeper、hadoop-common等 jar 包。/usr/share/hadoop、/usr/share/hive目录拷贝,或通过 MRS 的 maven 仓库引入): hive-jdbc-<version>.jarhive-service-<version>.jarzookeeper-<version>.jarhadoop-common-<version>.jarhadoop-auth-<version>.jar(Kerberos 认证依赖)先通过 Hive 官方的beeline工具测试连接,确认服务端配置正确:
beeline -u "jdbc:hive2://zk-node1:2181,zk-node2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/_HOST@HADOOP.COM" -n hiveuser -kbeeline能成功连接,说明服务端和认证配置正确,问题在 Spark 客户端;beeline也失败,需先排查 MRS 集群的 HiveServer2 状态、ZooKeeper 状态及 Kerberos 配置。authMech=3(用户名密码认证),URL 中添加password=<your-password>。zookeeper.auth=digest:username:password。spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties),查看 ZooKeeper 连接阶段的详细报错(如 “no route to host” 为网络问题,“invalid token” 为 Kerberos 认证失败)。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。