如何为apachehiveserver2/metastore服务器/webhcat服务器启用gc日志记录,同时防止日志文件覆盖和限制磁盘空间使用

cclgggtu  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(644)

我们最近决定为三个与apache配置单元相关的服务器启用gc日志记录:hiveserver2、配置单元metastore服务器和webhcat服务器。这在许多集群上(具体的版本各不相同),有助于研究与配置单元相关的内存和垃圾收集问题。在执行此操作时,我们希望避免可能发生的两个问题:
在服务器因任何原因重新启动时覆盖日志文件
日志占用了太多的磁盘空间,导致磁盘被填满
当一个进程的javagc日志记录开始时,它似乎会替换任何同名文件的内容。这意味着除非您小心,否则您将丢失gc日志记录,可能是在您更需要它的时候。
如果集群运行的时间足够长,除非进行管理,否则日志文件将填满磁盘。即使gc日志记录目前不是大量的,我们也希望管理出现异常情况的风险,这种情况会导致日志记录速率突然上升。

yebdmbv4

yebdmbv41#

对于hiveserver2和hivemetastore服务器与webhcat服务器,您如何做到这一点略有不同。两个我都回答。在这两种情况下,启动服务器时都需要设置一些jvm参数。
对于hiveserver2和hive metastore server,java参数将在hive-env.sh中设置。似乎这些都需要设置 HADOOP_OPTS ,但我们需要小心地将更改的范围限制在两个服务器上(而不是运行hive-env.sh的其他情况)。
对于webhcat服务器,您还将设置 HADOOP_OPTS 但是在启动服务器时调用的发行版中似乎没有“env.sh”文件,因此您需要在运行webhcat server之前在环境中设置它。但是,在ambari中,有一个webhcat env config组。
现在让我们来讨论在这些情况下要包含的jvm参数。
要启用文件的gc日志记录,您需要添加 -verbose:gc -Xloggc:<log-file-location> .
您需要特别考虑日志文件名,以防止在服务器重新启动时进行覆盖。似乎每次调用都需要一个唯一的名称,因此附加时间戳似乎是最好的选择。您可以包含类似“date+'%y%m%d%h%m'”的内容来添加时间戳。在本例中,它的格式为yyyymmddhhmm。在某些版本的java中,您可以将“%t”放在日志文件位置,它将被格式为yyyy-mm-dd\uhh-mm-ss的服务器启动时间戳替换。
现在开始管理磁盘空间的使用。如果有比我现有的更简单的方法,我会很高兴的。
首先,利用java内置的gc日志文件循环。 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M 是启用这种循环的一个例子,jvm中最多有10个gc日志文件,每个文件的大小不超过10mb左右。10x10MB是100mb的最大使用量。
随着gc日志文件轮换到位,最多有10个文件,“.0”、“.1”、“…”。9'将添加到您提供的文件名中 Xloggc . .0将是第一个,在它到达.9之后,它将替换.0并以循环方式继续。在java的某些版本中,“.current”将另外放在当前正在写入的日志文件名称的末尾。
由于独特的文件命名,我们显然必须避免重写,每个服务器进程调用可以有100mb,因此这不是管理配置单元服务器日志使用的磁盘空间的总体解决方案。在每次服务器调用上,您将得到一组最多10个gc日志文件——这可能会随着时间的推移而增加。最好的解决方案(在*nix下)似乎是使用logrotate实用程序(或其他一些实用程序)定期清理在过去n天内没有修改过的gc日志。
一定要计算一下,确保你有足够的磁盘空间。请注意,在某些主服务器上,您可能正在运行所有三种类型的服务器。
人们通常希望在gc日志中包含比默认日志更多的细节和上下文,因此考虑添加 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps .
将这一点与hiveserver2和hive metastore server结合起来,您可以向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 server时设置环境变量。
在上面,你可以改变 {{hive_log_dir}} 到您希望gc日志去的任何地方(您可能希望它和服务器的主日志去同一个地方)。您也可以更改日志文件的命名。
如果您使用apacheambari管理hadoop集群,那么这些更改将出现在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"

如果您使用apacheambari管理hadoop集群,那么您将执行与hive service>configs>advanced>advanced webhcat env>webhcat env template中的更改类似的操作。和Ambari在一起, {{templeton_log_dir}} 将自动替换为字段上方几行定义的webhcat log dir。我对上述bash行所做的一个更改是替换 -server- 在日志文件名中 -$$- 因为我不知道webhcat服务器是否是运行webhcat env的唯一对象(这既可以防止暗示它确实是服务器,也可以通过添加pid来防止冲突)。
在所有这些情况下,gc日志记录将在服务器重新启动时开始。考虑对hiveserver2和hive metastore进行滚动重启。

相关问题