#hadoop #logging #hive #garbage-collection #diskspace
#hadoop #ведение журнала #улей #сбор мусора #дисковое пространство
Вопрос:
Недавно мы решили включить ведение журнала GC для трех серверов, связанных с Apache Hive: HiveServer2, сервера метастора Hive и сервера WebHCat. Это относится к нескольким кластерам (точная версия варьируется), чтобы помочь разобраться в проблемах, связанных с памятью и сборкой мусора, связанных с ульем. При этом мы хотим избежать двух проблем, которые, как мы знаем, могут возникнуть:
- перезапись файла журнала при перезапуске сервера по любой причине
- журналы занимают слишком много места на диске, что приводит к заполнению дисков
Когда для процесса запускается ведение журнала Java GC, кажется, что он заменяет содержимое любого файла с тем же именем. Это означает, что, если вы не будете осторожны, вы потеряете ведение журнала GC, возможно, когда оно вам больше понадобится.
Если вы продолжаете работу кластера достаточно долго, файлы журналов будут заполнять диск, если не будут управляться. Даже если ведение журнала GC в настоящее время не является объемным, мы хотим управлять риском возникновения необычной ситуации, которая приводит к резкому увеличению скорости ведения журнала.
Ответ №1:
То, как вы это сделаете, будет немного отличаться для сервера HiveServer2 и сервера Hive MetaStore по сравнению с сервером WebHCat. Я отвечу на оба. В обоих случаях вам нужно будет установить некоторые параметры JVM при запуске серверов.
Для сервера HiveServer2 и сервера Hive MetaStore параметры Java будут установлены в hive-env.sh . Похоже, что их необходимо установить HADOOP_OPTS
, но нам нужно быть осторожными, чтобы ограничить область изменения двумя серверами (а не другими случаями, в которых hive-env.sh выполняется).
Для сервера WebHCat вы также будете настраивать HADOOP_OPTS
, но, похоже, нет «env.sh » файл в дистрибутиве вызывается при запуске сервера, поэтому вам нужно будет установить его в среде перед запуском WebHCat server. Однако в Ambari есть конфигурационная группа webhcat-env.
Теперь давайте обсудим параметры JVM для включения в этих случаях.
Чтобы включить ведение журнала GC в файл, вам нужно будет добавить -verbose:gc -Xloggc:<log-file-location>
.
Вам необходимо уделить особое внимание имени файла журнала, чтобы предотвратить перезапись при перезапуске серверов. Похоже, вам нужно иметь уникальное имя для каждого вызова, поэтому добавление метки времени кажется лучшим вариантом. Вы можете включить что-то вроде `date ‘%Y%m% d%H%M», чтобы добавить временную метку. В этом примере он имеет форму ГГГГММДДХХММ. В некоторых версиях Java вы можете поместить «%t» в расположение файла журнала, и оно будет заменено меткой времени запуска сервера в формате ГГГГ-ММ-DD_HH-ММ-SS.
Теперь перейдем к управлению использованием дискового пространства. Я буду рад, если есть более простой способ, чем тот, что у меня есть.
Во-первых, воспользуйтесь встроенной в Java функцией ротации файлов журнала GC. -XX: UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M
это пример включения этой ротации, содержащий до 10 файлов журнала GC из JVM, каждый из которых имеет размер не более 10 МБ. 10 x 10 МБ — это максимальное использование 100 МБ.
При ротации файлов журнала GC, содержащих до 10 файлов, к указанному вами имени файла будут добавлены ‘.0’, ‘.1’, … ‘.9’ Xloggc
. .0 будет первым, а после того, как он достигнет .9, он заменит .0 и продолжит циклически. В некоторых версиях Java ‘.current’ будет дополнительно помещен в конец имени файла журнала, в который в данный момент записывается.
Из-за уникального именования файлов, которое мы, по-видимому, должны использовать, чтобы избежать перезаписи, у вас может быть 100 МБ на вызов серверного процесса, так что это не полное решение для управления дисковым пространством, используемым журналами сервера Hive. В итоге вы получите набор из до 10 файлов журнала GC при каждом вызове сервера — это может складываться со временем. Лучшим решением (в соответствии с * nix) для этого, по-видимому, является использование утилиты logrotate (или какой-либо другой утилиты) для периодической очистки журналов GC, которые не были изменены за последние N дней.
Обязательно выполните вычисления и убедитесь, что у вас будет достаточно места на диске. Обратите внимание, что на некоторых основных серверах могут быть запущены все три типа серверов.
Люди часто хотят, чтобы в их журналах GC было больше деталей и контекста, чем по умолчанию, поэтому подумайте о добавлении -XX: PrintGCDetails -XX: PrintGCTimeStamps -XX: PrintGCDateStamps
.
Объединив это для сервера HiveServer2 и сервера метастора Hive, вы можете добавить что-то подобное в hive-env:
# note that $SERVICE is a string saying what it is that is being started
if [[ "$SERVICE" == "hiveserver2" || "$SERVICE" == "metastore" ]]; then
TIMESTAMP=`date '%Y%m%d%H%M'`
# GC log location/name prior to .n addition by log rotation
HIVE_SERVERS_GC_LOG_NAME="{{hive_log_dir}}/hive-$SERVICE-gc.log-$TIMESTAMP"
HIVE_SERVERS_GC_LOG_ENABLE_OPTS="-verbose:gc -Xloggc:$HIVE_SERVERS_GC_LOG_NAME"
HIVE_SERVERS_GC_LOG_ROTATION_OPTS="-XX: UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M"
HIVE_SERVERS_GC_LOG_FORMAT_OPTS="-XX: PrintGCDetails -XX: PrintGCTimeStamps -XX: PrintGCDateStamps"
HIVE_SERVERS_GC_LOG_OPTS="$HIVE_SERVERS_GC_LOG_ENABLE_OPTS $HIVE_SERVERS_GC_LOG_ROTATION_OPTS $HIVE_SERVERS_GC_LOG_FORMAT_OPTS"
export HADOOP_OPTS="$HADOOP_OPTS $HIVE_SERVERS_GC_LOG_OPTS"
fi
Это использует преимущество $SERVICE
, установленное Hive, для определения того, какой процесс запускается, и для установки переменных среды только тогда, когда это сервер HiveServer2 или сервер MetaStore.
В приведенном выше примере вы можете изменить {{hive_log_dir}}
, куда вы хотите, чтобы журналы GC отправлялись (вы, вероятно, хотите, чтобы они отправлялись в то же место, что и основные журналы сервера). Вы также можете изменить имя файла журнала.
Если вы управляете кластером Hadoop с помощью Apache Ambari, то эти изменения будут внесены в Hive service> Configs> Advanced> Advanced hive-env> hive-env template . С помощью Ambari {{hive_log_dir}}
он будет автоматически заменен каталогом журнала улья, определенным на несколько строк выше поля.
Теперь для вызова сервера WebHCat вручную вы можете заранее установить в среде следующее:
TIMESTAMP=`date '%Y%m%d%H%M'`
# GC log location/name prior to .n addition by log rotation
WEBHCAT_GC_LOG_NAME="{{templeton_log_dir}}/webhcat-server-gc.log-$TIMESTAMP"
WEBHCAT_GC_LOG_ENABLE_OPTS="-verbose:gc -Xloggc:$WEBHCAT_GC_LOG_NAME"
WEBHCAT_GC_LOG_ROTATION_OPTS="-XX: UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M"
WEBHCAT_GC_LOG_FORMAT_OPTS="-XX: PrintGCDetails -XX: PrintGCTimeStamps -XX: PrintGCDateStamps"
WEBHCAT_GC_LOG_OPTS="$WEBHCAT_GC_LOG_ENABLE_OPTS $WEBHCAT_GC_LOG_ROTATION_OPTS $WEBHCAT_GC_LOG_FORMAT_OPTS"
HADOOP_OPTS="$HADOOP_OPTS $WEBHCAT_GC_LOG_OPTS"
Если вы управляете кластером Hadoop с помощью Apache Ambari, то вам следует выполнить аналогичные изменения в Hive service> Configs> Advanced> Advanced webhcat-env> webhcat-env template . С помощью Ambari {{templeton_log_dir}}
он будет автоматически заменен каталогом журнала WebHCat, определенным на пару строк выше поля. Единственное изменение в приведенных выше строках Bash, которое я сделал, это заменить -server-
в имени файла журнала -$$-
на, поскольку я не знаю, является ли сервер WebHCat единственным, для которого запускается webhcat-env (это позволяет не подразумевать, что это сервер, и предотвращает конфликты, добавляя PID).
Во всех этих случаях ведение журнала GC начнется при перезапуске сервера. Рассмотрите возможность повторного перезапуска для HiveServer2 и Hive MetaStore.