Логирование в Hive

Под капотом Hive использует фреймворк Log4j 2 для ведения логов. Для конфигурации процессов логирования в Hive используйте настройки Custom log4j.properties в ADCM. Более подробная информация об этих настройках доступна в разделе Настройка логирования с помощью ADCM.

Расположение и формат лог-файлов

По умолчанию Hive хранит все логи в локальной файловой системе в корневой лог-директории /var/log/hive. Корневую директорию для лог-файлов можно указать с помощью свойства Log4j hive.log.dir. Логи Hive хранятся в виде обычных текстовых файлов с расширениями .log/.out. Большинство событий в Hive-логах имеют следующую структуру:

[Timestamp] [Severity] [Thread that generates the event] [Event message]

Например:

2024-01-29T16:26:24,216  INFO [HiveServer2-Background-Pool: Thread-71] ql.Driver: Executing command(queryId=hive_20240129162624_f4dfb3c4-3e27-4113-bbad-d524e54fcc26): drop table if exists hive_main_through_beeline_check_75320

Типы логов Hive

Логи Hive генерируются отдельными компонентами, такими как HiveServer2, Metastore, Beeline. Каждый компонент имеет свою собственную настраиваемую конфигурацию Log4j, которая определяет правила логирования для этого компонента. Основные типы логов, генерируемые компонентами Hive, описаны ниже.

Логи HiveServer2

По умолчанию Hive записывает логи HiveServer2 в файлы с именем hive-server2.log. В этих логах отражена активность компонента HiveServer2, включая все ошибки и исключения, возникающие в ядре HiveServer2. Например:

2024-01-30T13:42:04,048  INFO [1bd2c26d-2da1-4bea-aa8d-53e24b21fa9e HiveServer2-Handler-Pool: Thread-60] ql.Context: New scratch dir is hdfs://adh/tmp/hive/hive/1bd2c26d-2da1-4bea-aa8d-53e24b21fa9e/hive_2024-01-30_13-42-02_298_4565019303774254377-2
2024-01-30T13:42:04,097 ERROR [1bd2c26d-2da1-4bea-aa8d-53e24b21fa9e HiveServer2-Handler-Pool: Thread-60] parse.CalcitePlanner: CBO failed, skipping CBO.
org.apache.hadoop.hive.ql.parse.SemanticException: Line 1:12 Cannot insert into target table because column number/types are different 'transactions': Table insclause-0 has 4 columns, but query has 1 columns.
	at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genConversionSelectOperator(SemanticAnalyzer.java:8031) ~[hive-exec-3.1.3.jar:3.1.3]
	at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genFileSinkPlan(SemanticAnalyzer.java:7576) ~[hive-exec-3.1.3.jar:3.1.3]
	at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPostGroupByBodyPlan(SemanticAnalyzer.java:10635) ~[hive-exec-3.1.3.jar:3.1.3]
	at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genBodyPlan(SemanticAnalyzer.java:10507) ~[hive-exec-3.1.3.jar:3.1.3]
	at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:11420) ~[hive-exec-3.1.3.jar:3.1.3]
...

В файле hive-server2.out содержится перенаправленный вывод HiveServer2; данный файл очищается при каждом запуске HiveServer2.

Логи Metastore

В файлах hive-metastore.log хранится информация, связанная с активностью компонента Hive Metastore. Например:

2024-01-30T14:02:50,819  INFO [main] server.HiveServer2: Starting HiveServer2
2024-01-30T14:02:52,582  INFO [main] service.AbstractService: Service:OperationManager is inited.
2024-01-30T14:02:52,582  INFO [main] service.AbstractService: Service:SessionManager is inited.
2024-01-30T14:02:52,583  INFO [main] service.AbstractService: Service:CLIService is inited.
2024-01-30T14:02:52,583  INFO [main] service.AbstractService: Service:ThriftBinaryCLIService is inited.
...

Кроме того, логи Metastore содержат информацию об аудите Hive. Например:

$ grep 'audit' /var/log/hive/hive-metastore.log

Вывод:

2024-02-01T00:00:48,327  INFO [pool-6-thread-4] HiveMetaStore.audit: ugi=hive   ip=10.92.41.182 cmd=source:10.92.41.182 get_config_value: name=metastore.batch.retrieve.max defaultValue=50
...

Логи Beeline

Лог-файлы hive-beeline.log отражают информацию о работе Beeline shell.

Настройка логирования в ADCM

С использованием Log4j настройка процессов логирования в Hive сводится к модификации конфигурационных параметров в файлах *-log4j.properties. Эти файлы доступны в различных локациях на хостах с соответствующими компонентами Hive, и Hive считывает их при старте. Однако, чтобы не редактировать эти файлы вручную, ADCM предоставляет удобные настройки для изменения конфигураций Log4j на всех хостах кластера ADH. Для этого:

  1. В ADCM перейдите на страницу Clusters → <your_cluster_name> → Services → Hive → Primary Configuration и включите опцию Show advanced.

  2. В разделе настроек Custom log4j.properties откройте конфигурацию hive-log4j.properties, которая соответствует нужному Hive-компоненту и отредактируйте свойства Log4j. Параметры Log4j, указанные таким способом, расширяют/переопределяют значения в файлах *-log4j.properties, которые Hive считывает при старте. Подробная информация о конфигурационных свойствах Log4j доступна в документации Log4j 2.

  3. Сохраните конфигурацию сервиса Hive.

  4. Выполните рестарт сервиса Hive.

ПРИМЕЧАНИЕ
В данной статье любое упоминание действия "обновите свойство Log4j" подразумевает изменение конфигурационных параметров Log4j через ADCM UI, включая обязательный рестарт Hive.

Ниже приведен стандартный файл hive-log4j.properties, используемый компонентом HiveServer2. Основные конфигурационные параметры подсвечены комментариями, чтобы помочь вам быстрее освоить настройку Log4j. Подробная информация о конфигурационных свойствах Log4j доступна в документации Log4j 2.

status = INFO
name = HiveLog4j2
packages = org.apache.hadoop.hive.ql.log

# list of properties
property.hive.log.level = INFO (1)
property.hive.root.logger = DRFA (2)
property.hive.log.dir = /var/log/hive (3)
property.hive.log.file = hive-server2.log (4)
property.hive.perflogger.log.level = INFO

# list of all appenders
appenders = console, DRFA (5)

# console appender
appender.console.type = Console
appender.console.name = console
appender.console.target = SYSTEM_ERR
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{ISO8601} %5p [%t] %c{2}: %m%n

# daily rolling file appender
appender.DRFA.type = RollingRandomAccessFile (6)
appender.DRFA.name = DRFA
appender.DRFA.fileName = ${sys:hive.log.dir}/${sys:hive.log.file}
# Use %pid in the filePattern to append <process-id>@<host-name> to the filename if you want separate log files for different CLI session
appender.DRFA.filePattern = ${sys:hive.log.dir}/${sys:hive.log.file}.%d{yyyy-MM-dd} (7)
appender.DRFA.layout.type = PatternLayout
appender.DRFA.layout.pattern = %d{ISO8601} %5p [%t] %c{2}: %m%n (8)
appender.DRFA.policies.type = Policies
appender.DRFA.policies.time.type = TimeBasedTriggeringPolicy (9)
appender.DRFA.policies.time.interval = 1 (10)
appender.DRFA.policies.time.modulate = true

# list of all loggers
loggers = NIOServerCnxn, ClientCnxnSocketNIO, DataNucleus, Datastore, JPOX, PerfLogger, AmazonAws, ApacheHttp (11)

logger.NIOServerCnxn.name = org.apache.zookeeper.server.NIOServerCnxn
logger.NIOServerCnxn.level = WARN

logger.ClientCnxnSocketNIO.name = org.apache.zookeeper.ClientCnxnSocketNIO
logger.ClientCnxnSocketNIO.level = WARN

logger.DataNucleus.name = DataNucleus
logger.DataNucleus.level = ERROR

logger.Datastore.name = Datastore
logger.Datastore.level = ERROR

logger.JPOX.name = JPOX
logger.JPOX.level = ERROR

logger.AmazonAws.name=com.amazonaws
logger.AmazonAws.level = INFO

logger.ApacheHttp.name=org.apache.http
logger.ApacheHttp.level = INFO

logger.PerfLogger.name = org.apache.hadoop.hive.ql.log.PerfLogger
logger.PerfLogger.level = ${sys:hive.perflogger.log.level}

# root logger
rootLogger.level = ${sys:hive.log.level} (12)
rootLogger.appenderRefs = root
rootLogger.appenderRef.root.ref = ${sys:hive.root.logger}
1 Установка базового уровня логирования. Возможные уровни: ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF. События с меньшим уровнем не попадают в лог. Например, при использовании DEBUG генерируются более детальные и объемные логи, а при уровне ERROR Hive будет записывать в лог только ошибки и более критичные события.
2 Установка рутового логера (root logger). Логер DRFA записывает события в файл, который периодически ротируется.
3 Корневая директория для хранения лог-файлов. Все логи, сгенерированные с помощью данной конфигурации Log4j, будут храниться в указанной директории.
4 Имя лог-файла.
5 Список Log4j-аппендеров (appenders), которые отвечают за отправку событий в файл, в JMS-очередь, и так далее. В данной конфигурации используются 2 аппендера, которые направляют события в файл и в консоль.
6 Использование аппендера RollingRandomAccessFile, который записывает события в файл.
7 Шаблон, используемый для переименования файла при ротации.
8 Шаблон для преобразования объекта события в строку.
9 Использование политики TimeBasedTriggeringPolicy, которая определяет интервал ротации лог-файлов.
10 Стандартный интервал ротации лог-файлов (1 сутки).
11 Список всех активных логеров. Каждый логер генерирует события, относящиеся к определенному функционалу.
12 Объявление рутового логера (root logger). В Log4j логеры имеют иерархическую структуру, а свойства рутового логера наследуются другими нерутовыми логерами (за исключением явного переопределения свойств в логере-наследнике).

Типовые задачи

Ниже показаны решения типовых задач, которые могут возникнуть при настройке логирования Hive с помощью Log4j.

Изменение стандартного уровня логирования

 
Чтобы изменить уровень логирования (по умолчанию INFO), используйте свойство property.hive.log.level. Вы можете указать рутовый уровень, который будет наследоваться другими логерами Log4j, либо установить нужный уровень для конкретного логера, например logger.PerfLogger.level = <OTHER_LEVEL>.

Изменение местоположения логов по умолчанию

 
По умолчанию журналы Hive хранятся в директории /var/log/hive/. Для изменения директории используйте свойство property.hive.log.dir.

Включение/отключение логеров

 
В Log4j каждый logger отвечает за генерацию событий, связанных с определенным функционалом. Чтобы исключить из журналов ненужные события (например, события PerfLogger), удалите соответствующий логер из списка loggers = …​ или установите для этого логера более высокий уровень логирования.

Отображение ID запроса/сессии в логах HiveServer2

 
Вы можете включить отображение ID запросов/сессий Hive в логах HiveServer2. Для этого измените параметр appender.DRFA.layout.pattern в файле конфигурации HiveServer2 hive-log4j.properties как показано в примере ниже.

appender.DRFA.layout.pattern = %d{ISO8601} %5p [%t] %c{2}: QueryID: %X{queryId}; SessionID: %X{sessionId} %m%n

После этого ID запросов/сессий Hive будут доступны в логах. Например:

2024-02-01T17:17:01,175  INFO [5818afd9-10b9-4d59-9efc-33fb4b5d2c2c HiveServer2-Handler-Pool: Thread-49] exec.SelectOperator: QueryID: hive_20240201171700_bdc1be52-6070-41f9-bb5d-d9b2c33dd24b; SessionID: 5818afd9-10b9-4d59-9efc-33fb4b5d2c2c SELECT struct<txn_id:int,acc_id:int,txn_amount:decimal(10,2),txn_date:date>
2024-02-01T17:17:01,175  INFO [5818afd9-10b9-4d59-9efc-33fb4b5d2c2c HiveServer2-Handler-Pool: Thread-49] exec.ListSinkOperator: QueryID: hive_20240201171700_bdc1be52-6070-41f9-bb5d-d9b2c33dd24b; SessionID: 5818afd9-10b9-4d59-9efc-33fb4b5d2c2c Initializing operator LIST_SINK[3]
...
Изменение политики ротации логов

 
По умолчанию логи Hive ротируются ежедневно. Чтобы изменить политику ротации и, например, добавить ротацию в зависимости от размера файла, используйте SizeBasedTriggeringPolicy как показано ниже. Следующие параметры Log4j позволяют выполнять ротацию лог-файла при достижении определенного размера (10 MБ).

appender.DRFA.policies.size.type = SizeBasedTriggeringPolicy
appender.DRFA.policies.size.size = 10MB
# '%i' is mandatory if SizeBasedTriggeringPolicy is used with TimeBasedTriggeringPolicy:
appender.DRFA.filePattern = ${sys:hive.log.dir}/${sys:hive.log.file}.%d{yyyy-MM-dd}-%i
Автоматическая архивация логов

 
Сразу после выполнения ротации вы можете сжать "старый" лог-файл для экономии места. Для этого необходимо указать желаемый формат архива в свойстве filePattern, как показано в примере ниже. Если значение filePattern заканчивается символами ".gz", ".zip", ".bz2", ".deflate", ".pack200", ".zst" или ".xz", Log4j автоматически выполнит архивацию, используя соответствующий алгоритм сжатия.

appender.DRFA.filePattern = ${sys:hive.log.dir}/${sys:hive.log.file}.%d{yyyy-MM-dd}-%i.log.gz

Просмотр логов в веб-интерфейсе

Веб-интерфейс HiveServer2 позволяет просматривать текстовые логи на странице Local logs. На этой странице отображается содержимое корневой лог-директории (устанавливается свойством hive.log.dir), где вы можете перемещаться между директориями и просматривать логи в виде обычного текста.

Страница Local logs
Страница Local logs
Страница Local logs
Страница Local logs
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней