如何为 Apache HiveServer2/MetaStore server/WebHCat 服务器启用 GC 日志记录,同时防止日志文件覆盖和限制磁盘 space 使用

How to enable GC logging for Apache HiveServer2/MetaStore server/WebHCat server, while preventing log file overwrites and capping disk space usage

我们最近决定为三个与 Apache Hive 相关的服务器启用 GC 日志记录:HiveServer2、Hive MetaStore 服务器和 WebHCat 服务器。这是在许多集群上(确切的版本不同)作为查看与 Hive 相关的内存和垃圾收集问题的帮助。这样做时,我们想避免两个我们知道可能会发生的问题:

当 Java GC 日志记录开始时,它似乎会替换任何同名文件的内容。这意味着除非您小心,否则您将丢失 GC 日志记录,也许在您更有可能需要它的时候。

如果您将群集 运行 保持足够长的时间,除非进行管理,否则日志文件将填满磁盘。即使 GC 日志记录目前不是很多,我们也希望管理出现导致日志记录率突然飙升的异常情况的风险。

HiveServer2 和 Hive MetaStore 服务器与 WebHCat 服务器的执行方式略有不同。我会回答两个。在这两种情况下,您都需要在启动服务器时设置一些 JVM 参数。

对于 HiveServer2 和 Hive MetaStore 服务器,Java 参数将在 hive-env.sh 中设置。看起来这些需要在 HADOOP_OPTS 中设置,但我们需要注意将更改范围限制在两个服务器(而不是 hive-env.sh 为 [= 的其他情况) 76=]).

对于 WebHCat 服务器,您还将设置 HADOOP_OPTS 但是在启动服务器时调用的分发中似乎没有 "env.sh" 文件,因此您需要设置它在 运行ning WebHCat 服务器之前的环境中。但是,在 Ambari 中,有一个 webhcat-env 配置组。

现在让我们讨论在这些情况下要包含的 JVM 参数。

要启用 GC 日志记录到文件,您需要添加 -verbose:gc -Xloggc:<log-file-location>

您需要特别考虑日志文件名,以防止在服务器重新启动时被覆盖。似乎每次调用都需要一个唯一的名称,因此附加时间戳似乎是最佳选择。您可以包含诸如“date +'%Y%m%d%H%M'”之类的内容来添加时间戳。在这个例子中,它是 YYYYMMDDHHMM 的形式。在某些版本的 Java 中,您可以将“%t”放在您的日志文件位置,它将被格式为 YYYY-MM-DD_HH-MM-SS.

的服务器启动时间戳所取代

现在开始管理磁盘的使用 space。如果有比我现有的更简单的方法,我会很高兴。

首先,利用 Java 的内置 GC 日志文件轮换。 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M 是启用此循环的示例,JVM 有多达 10 个 GC 日志文件,每个文件的大小不超过大约 10MB。 10 x 10MB 是 100MB 最大使用量。

随着 GC 日志文件轮换最多 10 个文件,“.0”、“.1”...“.9”将添加到您在 [=16= 中提供的文件名中]. .0 将是第一个,在达到 .9 后它将替换 .0 并以循环方式继续。在某些版本中 Java '.current' 将被附加在当前正在写入的日志文件名称的末尾。

由于独特的文件命名,我们显然必须避免覆盖,您可以有 100MB 每个服务器进程调用,所以这不是管理磁盘的完整解决方案space 由 Hive 服务器日志使用。您最终会在每次服务器调用时得到一组最多 10 个 GC 日志文件——这会随着时间的推移而增加。最好的解决方案(在 *nix 下)似乎是使用 logrotate 实用程序(或其他一些实用程序)定期清理最近 N 天未修改的 GC 日志。

一定要算一下,确保你有足够的磁盘 space。请注意,在某些主服务器上,您可能 运行 连接所有三种服务器。

人们经常希望在他们的 GC 日志中看到比默认情况下更多的详细信息和上下文,因此请考虑添加 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps

将 HiveServer2 和 Hive MetaStore 服务器放在一起,您可以将以下内容添加到 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

这利用了由 Hive 设置的 $SERVICE 来确定正在启动的进程类型,并且仅在它是 HiveServer2 或 MetaStore 服务器时才设置环境变量。

在上面,您可以将 {{hive_log_dir}} 更改为您希望 GC 日志所在的位置(您可能希望它与服务器的主日志位于同一位置)。您也可以更改日志文件命名。

如果您使用 Apache Ambari 管理 Hadoop 集群,那么这些更改将位于 Hive 服务 > 配置 > 高级 > 高级 hive-env > hive-env 模板中。使用 Ambari,{{hive_log_dir}} 将自动替换为定义在字段上方几行的 Hive 日志目录。

现在对于手动调用的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"

如果您正在使用 Apache Ambari 管理 Hadoop 集群,那么您将执行类似于 Hive 服务 > 配置 > 高级 > 高级 webhcat-env > webhcat-env 模板中的更改。使用 Ambari,{{templeton_log_dir}} 将自动替换为在字段上方定义的几行 WebHCat 日志目录。我所做的对上述 Bash 行的一个更改是将日志文件名中的 -server- 替换为 -$$- 因为我不知道 WebHCat 服务器是否是 webhcat-env 唯一的东西是 运行 的(这既可以防止暗示肯定是服务器,也可以通过添加 PID 来防止冲突)。

在所有这些情况下,GC 日志记录将在服务器重启时开始。考虑 HiveServer2 和 Hive MetaStore 的滚动重启。