Улей metastore, страдающий от Kerberos "Ошибка перекоса часов"
Недавно мы сталкивались с проблемой, описанной в названии, один раз в месяц. На узле metastore мы установили и запустили службу ntpd для синхронизации времени с сервером kerberos. Krb5.conf на узле выглядит так:
[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24 часа
renew_lifetime = 7 дней
forwardable = true
Таким образом, представляется менее вероятным, что время на метастазах рассинхронизируется с сервером Kerberos (>=5 минут) в результате проблемы или из-за блокировки сети.
Из журнала метастазов видно, что время регистрации исключений "Слишком велика ошибка часов" вышло из строя, например,
2016-01-16 18: 18: 48,071 ОШИБКА [pool-3-thread-63735]
2016-01-16 19: 07: 03,699 ОШИБКА [pool-3-thread-63798]
2016-01-16 19: 06: 55,998 ОШИБКА [pool-3-thread-63796]
2016-01-16 19: 06: 41 653 ОШИБКА [pool-3-thread-63812]
2016-01-16 19: 04: 28 659 ОШИБКА [pool-3-thread-63806]
2016-01-16 19: 04: 13,937 ОШИБКА [pool-3-thread-63804]
2016-01-16 19: 02: 19,312 ОШИБКА [pool-3-thread-63809]
2016-01-16 19: 02: 13,115 ОШИБКА [pool-3-thread-63794]
2016-01-16 19: 02: 06,028 ОШИБКА [pool-3-thread-63800]
2016-01-16 19: 01: 50,767 ОШИБКА [pool-3-thread-63795]
2016-01-16 18: 59: 36 926 ОШИБКА [pool-3-thread-63810]
2016-01-16 18: 59: 36 394 ОШИБКА [pool-3-thread-63797]
Стек исключений:
2016-01-16 18: 59: 36,394 ОШИБКА [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.evaluateChallengeOrResponse(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$HiveSaslServerTransportFactory.getTransport(HadoopThriftAuthBridge.java:172) в org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$TUGIAssumingTransportFactory$1.run(HadoopThriftAuthBridge20S.java:678) в org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$TUGIAssumingTransportFactory$1.run(HadoopThriftAuthBridge20S.java:675) at java.security.AccessController.doPrivileged(собственный метод) at javax.security.auth.Subject.doAs(Subject.java:356) в org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1536) в org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S$Server$TUGIAssumingTransportFactory.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) на java.lang.Thread.run(Thread.java:744) Вызвано: GSSException: ошибка не указана на уровне GSS-API (уровень механизма: слишком большой перекос часов (37)) в org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(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$HiveSaslServerTransportFactory.getTransport(HadoopThriftAuthBridge.java:172) ... еще 10
ENV:
Java-версия "1.7.0_45" Java HotSpot(TM) 64-разрядная серверная виртуальная машина (сборка 24.51-b03, смешанный режим) Улей-0.13.1.2.1.10.0-HDP
Так что мне делать, если я хочу выяснить причину? Какие-либо предложения? Большое спасибо.
3 ответа
Я также видел эту ошибку, и в моем случае первопричина не имела никакого отношения к Kerberos. Если вы используете базу данных MySql в качестве хранилища данных, существует довольно серьезная утечка памяти, https://issues.apache.org/jira/browse/HIVE-15551, которая была введена в версии 0.13 и не исправлена до Hive 1.3.0. По сути, тот, кто изначально написал код, либо забыл, либо не осознал, что вы должны явно закрывать операторы JDBC, и это приводит к чрезмерной сборке мусора, когда ваш процесс достигает своих пределов памяти. Как только это происходит, все в процессе становится все медленнее, и вы начинаете видеть эти ошибки перекоса часов.
Вы можете определить, является ли это вашей проблемой, запустив живую гистограмму jmap для процесса metastore. Если вы видите объекты JDBC в верхней части списка (в моем случае это были com.mysql.jdbc.JDBC42ResultSet и com.mysql.jdbc.StatementImpl), вы, вероятно, столкнулись с этой проблемой. Я рекомендую либо применить исправление, обновить его до версии Hive 1.3.0, либо использовать обходной путь, упомянутый в этой проблеме, чтобы убедиться, что это не поможет.
Использовать kdestroy
команда, а затем kinit
.
В kdestroy
Команда уничтожает активные билеты авторизации Kerberos пользователя и удаляет кэш учетных данных, который их содержит.
kinit
используется для получения и кэширования билетов на выдачу билетов Kerberos
Удаление кеша и повторное "кинитирование" может решить вашу проблему. Если кеша нет,kdestroy
вернет "kdestroy: Кэш учетных данных не найден при уничтожении кеша".
В kdestroy
документацию можно найти здесь.
Запустите эту команду, чтобы синхронизировать ваши часы с KDC:
/sbin/служба ntpd стоп; /usr/sbin/ntpdate IP-адрес_сервера_KDC_server; /sbin/запуск службы ntpd