Логирование в 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. Для этого:
-
В ADCM перейдите на страницу Clusters → <your_cluster_name> → Services → Hive → Primary Configuration и включите опцию Show advanced.
-
В разделе настроек Custom log4j.properties откройте конфигурацию hive-log4j.properties, которая соответствует нужному Hive-компоненту и отредактируйте свойства Log4j. Параметры Log4j, указанные таким способом, расширяют/переопределяют значения в файлах *-log4j.properties, которые Hive считывает при старте. Подробная информация о конфигурационных свойствах Log4j доступна в документации Log4j 2.
-
Сохраните конфигурацию сервиса Hive.
-
Выполните рестарт сервиса 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 запросов/сессий 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
), где вы можете перемещаться между директориями и просматривать логи в виде обычного текста.