记录一次华为MRS 集群排错案例 【玩转华为云】
【摘要】 某内部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 ZooKe...
某内部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)以及客户端参数匹配有关。
一、错误原因分析
-
错误①:unable to read HiveServer2 configs from ZooKeeper
-
原因:Spark 通过 ZooKeeper 自动发现 HiveServer2 地址时失败。可能是 ZooKeeper 集群地址 / 端口错误、ZooKeeper 中 HiveServer2 的注册路径(默认
/hiveserver2
)被修改,或网络不通(如防火墙阻止 ZooKeeper 端口 2181/2182)。 -
错误②:KeeperErrorCode=Session closed because client failed to authenticate for /hiveserver2
-
原因:ZooKeeper 启用了认证机制(MRS 集群通常默认集成 Kerberos,ZooKeeper 可能依赖 Kerberos 认证),而 Spark 客户端未正确配置认证信息,导致 ZooKeeper 拒绝连接。
二、解决步骤(针对 MRS 集群 Hive 的适配)
1. 确认 Hive 连接的核心参数(基于 ZooKeeper 的服务发现)
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 认证参数)。
2. 配置 Kerberos 认证(解决 ZooKeeper 认证失败)
MRS 集群的 Hive 和 ZooKeeper 通常集成 Kerberos 安全认证,客户端必须通过 Kerberos 认证才能访问。需完成以下配置:
(1)获取 Kerberos 配置文件
从 MRS 集群控制台下载:
krb5.conf
:Kerberos 的配置文件(包含 KDC 地址、 Realm 等信息)。- 用于访问 Hive 的
keytab
文件(如hiveuser.keytab
)和对应的principal
(如hiveuser@HADOOP.COM
)。
将这两个文件放置在本地 Spark 服务器的可访问路径(如
/etc/krb5.conf
、/opt/keytabs/hiveuser.keytab
)。(2)Spark 代码中添加 Kerberos 认证参数
在
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() } }
3. 验证 ZooKeeper 连接与路径
- 检查 ZooKeeper 地址和端口:通过
telnet zk-node1 2181
测试网络连通性,确保本地 Spark 服务器能访问 MRS 的 ZooKeeper 节点。 - 确认 HiveServer2 在 ZooKeeper 的注册路径:若云端 MRS 修改过默认路径(非
/hiveserver2
),需在 URL 中同步修改zooKeeperNamespace
参数(如zooKeeperNamespace=custom-hiveserver2
)。
4. 依赖包兼容性处理(避免版本冲突)
MRS 3.3.0 对应的 Hive 版本通常为 2.x 或 3.x,需确保本地 Spark 的依赖包与 MRS 版本兼容:
- 移除 Spark 默认的低版本
hive-jdbc
、zookeeper
、hadoop-common
等 jar 包。 - 添加 MRS 3.3.0 配套的依赖(可从 MRS 集群的
/usr/share/hadoop
、/usr/share/hive
目录拷贝,或通过 MRS 的 maven 仓库引入):hive-jdbc-<version>.jar
hive-service-<version>.jar
zookeeper-<version>.jar
hadoop-common-<version>.jar
hadoop-auth-<version>.jar
(Kerberos 认证依赖)
5. 用 beeline 工具验证连接(排除服务端问题)
先通过 Hive 官方的
beeline
工具测试连接,确认服务端配置正确:beeline -u "jdbc:hive2://zk-node1:2181,zk-node2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/_HOST@HADOOP.COM" -n hiveuser -k
- 若
beeline
能成功连接,说明服务端和认证配置正确,问题在 Spark 客户端; - 若
beeline
也失败,需先排查 MRS 集群的 HiveServer2 状态、ZooKeeper 状态及 Kerberos 配置。
三、注意一下下
- MRS 安全模式差异:若云端 MRS 集群未启用 Kerberos(非安全模式),则认证参数简化为
authMech=3
(用户名密码认证),URL 中添加password=<your-password>
。 - ZooKeeper 认证类型:除 Kerberos 外,部分场景可能使用 ZooKeeper 的 Digest 认证,需在 URL 中添加
zookeeper.auth=digest:username:password
。 - 日志排查:开启 Spark 的 DEBUG 日志(
spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties
),查看 ZooKeeper 连接阶段的详细报错(如 “no route to host” 为网络问题,“invalid token” 为 Kerberos 认证失败)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)