Java 配置单元元存储遭受kerberos的困扰”;时钟偏移太大”;错误

Java 配置单元元存储遭受kerberos的困扰”;时钟偏移太大”;错误,java,hive,kerberos,metastore,Java,Hive,Kerberos,Metastore,最近,我们遇到了一个问题,如标题所述,每月一次。在metastore节点上,我们已经安装并启动了ntpd服务,以便与kerberos服务器同步时间。节点上的krb5.conf如下所示: [libdefaults] default_realm=EXAMPLE.COM dns_lookup_realm=true dns_lookup_kdc=true 票证寿命=24小时 续约寿命=7d 可转发=真 因此,元存储上的时间与kerberos服务器不同步(>=5min)导致问题或网络阻塞的可能性似乎较小。

最近,我们遇到了一个问题,如标题所述,每月一次。在metastore节点上,我们已经安装并启动了ntpd服务,以便与kerberos服务器同步时间。节点上的krb5.conf如下所示:

[libdefaults]
default_realm=EXAMPLE.COM
dns_lookup_realm=true
dns_lookup_kdc=true
票证寿命=24小时
续约寿命=7d
可转发=真

因此,元存储上的时间与kerberos服务器不同步(>=5min)导致问题或网络阻塞的可能性似乎较小。
从metastore日志中可以看出,“时钟偏移太大”异常记录时间不正常,例如

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 2016-01-16 18:59:36394错误[pool-3-thread-63797]:transport.TSaslTransport(TSaslTransport.java:open(296))-SASL协商失败 javax.security.sasl.SaslException:GSS启动失败[由GSSException引起:GSS-API级别未指定的故障(机制级别:时钟偏差太大(37))] 位于com.sun.security.sasl.gsskerb.GssKrb5Server.evaluateResponse(GssKrb5Server.java:177) 在org.apache.thrift.transport.TSaslTransport$SaslParticipant.evaluatechallengeeorresponse(TSaslTransport.java:509) 位于org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:264) 位于org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41) 在org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$hivesalservertransportfactory.getTransport(HadoopThriftAuthBridge.java:172) 在org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$tugiasumingtransportfactory$1.run(HadoopThriftAuthBridge20S.java:678) 在org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$tugiasumingtransportfactory$1.run(HadoopThriftAuthBridge20S.java:675) 位于java.security.AccessController.doPrivileged(本机方法) 位于javax.security.auth.Subject.doAs(Subject.java:356) 位于org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1536) 在org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$tugiasumingtransportfactory.getTransport(HadoopThriftAuthBridge20S.java:675) 位于org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:189) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 运行(Thread.java:744) 原因:GSSExException:GSS-API级别未指定故障(机制级别:时钟偏差太大(37)) 位于org.apache.thrift.transport.TSaslServerTransport.handlesalstartmessage(TSaslServerTransport.java:125) 位于org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253) 位于org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41) 在org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$hivesalservertransportfactory.getTransport(HadoopThriftAuthBridge.java:172) ... 10多 环境:

java版本“1.7.0_45” Java HotSpot(TM)64位服务器虚拟机(构建24.51-b03,混合模式) 蜂巢-0.13.1.2.1.10.0-hdp 那么,如果我想找出根本原因,我该怎么办?有什么建议吗?
非常感谢。

我也看到了这个错误,就我而言,根本原因与Kerberos无关。如果您使用MySql数据库作为数据存储,那么存在一个非常严重的内存泄漏,它是在0.13中引入的,直到Hive1.3.0才得到修复。基本上,最初编写代码的人要么忘记了,要么没有意识到必须显式关闭JDBC语句,这会在进程达到内存限制时导致过度的垃圾收集。一旦发生这种情况,过程中的一切都会逐渐变慢,以至于您开始看到这些时钟偏差错误


您可以通过在metastore进程上运行jmap live直方图来判断这是否是您的问题。如果您看到列表顶部的JDBC对象(在我的例子中是com.mysql.JDBC.JDBC42ResultSet和com.mysql.JDBC.statementpl),您可能遇到了这个问题。我建议您要么应用修补程序,升级到Hive 1.3.0,要么使用本期中提到的解决方法,看看这是否会解决问题。

我也看到了这个错误,在我的情况下,根本原因与Kerberos无关。如果您使用MySql数据库作为数据存储,那么存在一个非常严重的内存泄漏,它是在0.13中引入的,直到Hive1.3.0才得到修复。基本上,最初编写代码的人要么忘记了,要么没有意识到必须显式关闭JDBC语句,这会在进程达到内存限制时导致过度的垃圾收集。一旦发生这种情况,过程中的一切都会逐渐变慢,以至于您开始看到这些时钟偏差错误

您可以通过在metastore进程上运行jmap live直方图来判断这是否是您的问题。如果您看到列表顶部的JDBC对象(在我的例子中是com.mysql.JDBC.JDBC42ResultSet和com.mysql.JDBC.statementpl),您就是li 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