hive元存储遭遇kerberos“时钟偏差太大”错误

xdyibdwo  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(516)

最近我们遇到了一个问题,如标题中所描述的每月一次。在metastore节点上,我们已经安装并启动了ntpd服务来与kerberos服务器同步时间。节点上的krb5.conf如下所示:
[默认值]
默认\u realm=example.com
dns\u lookup\u realm=真
dns\u lookup\u kdc=真
车票寿命=24小时
续航时间=7d
forwardable=真
因此,metastore上的时间与kerberos服务器不同步(>=5min)导致问题或网络阻塞的可能性较小。
从metastore日志中可以看出,“clock skew too great”异常日志记录时间是无序的,例如,
2016-01-16 18:18:48071错误[pool-3-thread-63735]
2016-01-16 19:07:03699错误[pool-3-thread-63798]
2016-01-16 19:06:55998错误[pool-3-thread-63796]
2016-01-16 19:06:41653错误[pool-3-thread-63812]
2016-01-16 19:04:28659错误[pool-3-thread-63806]
2016-01-16 19:04:13937错误[pool-3-thread-63804]
2016-01-16 19:02:19312错误[pool-3-thread-63809]
2016-01-16 19:02:13115错误[pool-3-thread-63794]
2016-01-16 19:02:06028错误[pool-3-thread-63800]
2016-01-16 19:01:50767错误[pool-3-thread-63795]
2016-01-16 18:59:36926错误[pool-3-thread-63810]
2016-01-16 18:59:36394错误[pool-3-thread-63797]
异常堆栈:

2016-01-16 18:59:36,394 ERROR [pool-3-thread-63797]: transport.TSaslTransport (TSaslTransport.java:open(296)) - SASL negotiation failure
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Clock skew too great (37))]
        at com.sun.security.sasl.gsskerb.GssKrb5Server.evaluateResponse(GssKrb5Server.java:177)
        at org.apache.thrift.transport.TSaslTransport$SaslParticipant.evaluateChallengeOrResponse(TSaslTransport.java:509)
        at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:264)
        at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41)
        at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$HiveSaslServerTransportFactory.getTransport(HadoopThriftAuthBridge.java:172)
        at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$TUGIAssumingTransportFactory$1.run(HadoopThriftAuthBridge20S.java:678)
        at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$TUGIAssumingTransportFactory$1.run(HadoopThriftAuthBridge20S.java:675)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:356)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1536)
        at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$TUGIAssumingTransportFactory.getTransport(HadoopThriftAuthBridge20S.java:675)
        at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:189)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Clock skew too great (37))
        at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125)
        at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253)
        at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41)
        at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$HiveSaslServerTransportFactory.getTransport(HadoopThriftAuthBridge.java:172)  
        ... 10 more

环境:

java version "1.7.0_45"
 Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
 hive-0.13.1.2.1.10.0-hdp

如果我想找出根本原因,我该怎么办?有什么建议吗?非常感谢。

dzjeubhm

dzjeubhm1#

使用 kdestroy 命令然后 kinit .
这个 kdestroy 命令销毁用户的活动kerberos授权票证并删除包含它们的凭据缓存。 kinit 用于获取和缓存kerberos票证授予票证
删除缓存并再次“扭结”可能会解决您的问题。如果没有缓存, kdestroy 将返回“kdestroy:销毁缓存时找不到凭据缓存”。
这个 kdestroy 文档可以在这里找到。

cgyqldqp

cgyqldqp2#

我也看到过这个错误,在我的例子中,根本原因与kerberos无关。如果您使用mysql数据库作为数据存储,则会出现相当严重的内存泄漏,https://issues.apache.org/jira/browse/hive-15551,它是在0.13中引入的,直到hive1.3.0才被修复。基本上,最初编写代码的人要么忘记了,要么没有意识到必须显式关闭jdbc语句,这会在进程达到内存限制时导致过度的垃圾收集。一旦发生这种情况,过程中的一切都会逐渐变慢,以至于您开始看到这些时钟偏差错误。
您可以通过在metastore进程上运行jmap live直方图来判断这是否是您的问题。如果您看到列表顶部的jdbc对象(在我的例子中是com.mysql.jdbc.jdbc42resultset和com.mysql.jdbc.statementimpl),您可能遇到了这个问题。我建议您要么应用修补程序,升级到hive1.3.0,要么使用本期中提到的解决方法,看看这是否能解决问题。

相关问题