我们最近决定在许多集群上启用hadoop namenodes的gc日志记录(具体版本各不相同),以帮助研究namenode相关的内存和垃圾收集问题。我们希望集群中的所有namenodes(active和standby或primary和secondary)都使用这个名称。我们还希望避免可能发生的两个问题:
在namenode因任何原因重新启动时覆盖日志文件
日志占用了太多的磁盘空间,导致磁盘被填满
当一个进程的javagc日志记录开始时,它似乎会替换任何同名文件的内容。这意味着除非您小心,否则您将丢失gc日志记录,可能是在您更需要它的时候。
如果集群运行的时间足够长,除非进行管理,否则日志文件将填满磁盘。即使gc日志记录目前不是大量的,我们也希望管理导致日志记录率急剧上升的异常情况的风险。
1条答案
按热度按时间zaq34kh61#
可以在hadoop-env.sh中设置几个环境变量,以便在namenode启动时为其传递jvm参数:
HADOOP_OPTS
(适用于所有以“hadoop”开始的客户端和服务器调用,甚至是“hadoop dfs”)HADOOP_NAMENODE_OPTS
(使用namenode ha会影响活动和备用namenodes,而不使用namenode ha会影响主namenode)HADOOP_SECONDARYNAMENODE_OPTS
(如果没有namenode ha,则影响辅助namenode)这个问题是专门针对namenode的,因此我们希望将jvm参数添加到
HADOOP_NAMENODE_OPTS
以及HADOOP_SECONDARYNAMENODE_OPTS
(如相关)。现在让我们讨论要包含在其中的jvm参数。要启用文件的gc日志记录,您需要添加
-verbose:gc -Xloggc:<log-file-location>
.您需要特别考虑日志文件名,以防止在重新启动namenode时进行覆盖。似乎每次调用都需要一个唯一的名称,因此附加时间戳似乎是最好的选择。您可以包含类似“date+'%y%m%d%h%m'”的内容来添加时间戳。在本例中,它的格式为yyyymmddhhmm。在某些版本的java中,您可以将“%t”放在日志文件位置,它将被格式为yyyy-mm-dd\uhh-mm-ss的namenode启动时间戳替换。
现在开始管理磁盘空间的使用。如果有比我现有的更简单的方法,我会很高兴的。
首先,利用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”将另外放在当前正在写入的日志文件名称的末尾。由于独特的文件命名,我们显然必须避免重写,每个namenode进程调用可以有100mb,因此这不是管理namenode gc日志使用的磁盘空间的总体解决方案。您将在每个namenode服务器上得到一组最多10个gc日志文件——这可能会随着时间的推移而增加。最好的解决方案(在*nix下)似乎是使用logrotate实用程序(或其他一些实用程序)定期清理过去n天内没有修改过的namenode gc日志。
一定要计算一下,确保你有足够的磁盘空间。
人们通常希望在gc日志中包含比默认日志更多的细节和上下文,因此考虑添加
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
.把这些放在一起,您可以向hadoop env添加以下内容:
应该插在
HADOOP_NAMENODE_OPTS
以及HADOOP_SECONDARYNAMENODE_OPTS
已设置。然后添加$HADOOP_NAMENODE_OPTS
上HADOOP_NAMENODE_OPTS
以及HADOOP_SECONDARYNAMENODE_OPTS
(如果存在)代替任何现有的gc记录相关参数。在上面,你可以改变
{{hdfs_log_dir_prefix}}/$USER
到您希望gc日志去的任何地方(您可能希望它去与namenode日志相同的地方)。您也可以更改日志文件的命名。如果您使用apacheambari管理hadoop集群,那么这些更改将出现在hdfs service>configs>advanced>advanced hadoop env>hadoop env template中。和Ambari在一起,
{{hdfs_log_dir_prefix}}
将自动替换为字段上方几行定义的hadoop log dir前缀。gc日志记录将在namenode重新启动时开始。如果您有namenode ha并且两个namenodes都在线,那么您可以一次重新启动一个,而不需要任何停机时间。