- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们最近决定在多个集群(具体版本各不相同)上为 Hadoop NameNode 启用 GC 日志记录,以帮助调查与 NameNode 相关的内存和垃圾收集问题。我们希望集群中的所有 NameNode(事件和备用或主要和次要)都这样做。我们还想避免两个我们知道可能会发生的问题:
当为进程启动 Java GC 日志记录时,它似乎会替换任何具有相同名称的文件的内容。这意味着除非您小心,否则您将丢失 GC 日志记录,也许在您更有可能需要它的时候。
如果您让集群运行足够长的时间,日志文件将填满磁盘,除非进行管理。即使 GC 日志记录目前不是很多,我们也希望管理出现导致日志记录率飙升的异常情况的风险。
最佳答案
可以在 hadoop-env.sh 中设置环境变量的几个选择,以便在启动时为 NameNode 传递 JVM 参数:
HADOOP_OPTS
(适用于所有已启动的客户端和服务器调用使用“hadoop”,甚至“hadoop dfs”)HADOOP_NAMENODE_OPTS
(使用 NameNode HA 这会影响事件和备用 NameNode,而没有 NameNode HA 会影响主 NameNode)HADOOP_SECONDARYNAMENODE_OPTS
(影响secondary NameNode,如果没有NameNode HA)这个问题专门针对 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_HH-MM-SS 的 NameNode 启动时间戳替换。
现在开始管理磁盘空间的使用。如果有比我现有的更简单的方法,我会很高兴。
首先,利用 Java 内置的 GC 日志文件轮换。 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M
是启用这种循环的一个例子,有多达 10 个来自 JVM 的 GC 日志文件,每个文件的大小不超过 10MB。 10 x 10MB 是 100MB 的最大使用量。
有了最多 10 个文件的 GC 日志文件轮换,“.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:
TIMESTAMP=`date +'%Y%m%d%H%M'`
# location/name prior to .n addition by log rotation
NAMENODE_GC_LOG_NAME="{{hdfs_log_dir_prefix}}/$USER/hdfs-namenode-gc.log-$TIMESTAMP"
NAMENODE_GC_LOG_ENABLE_OPTS="-verbose:gc -Xloggc:$NAMENODE_GC_LOG_NAME"
NAMENODE_GC_LOG_ROTATION_OPTS="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M"
NAMENODE_GC_LOG_FORMAT_OPTS="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps"
NAMENODE_GC_LOG_OPTS="$NAMENODE_GC_LOG_ENABLE_OPTS $NAMENODE_GC_LOG_ROTATION_OPTS $NAMENODE_GC_LOG_FORMAT_OPTS"
那应该插入到 HADOOP_NAMENODE_OPTS
上面的某处和 HADOOP_SECONDARYNAMENODE_OPTS
被设置。然后添加 $HADOOP_NAMENODE_OPTS
到 HADOOP_NAMENODE_OPTS
和 HADOOP_SECONDARYNAMENODE_OPTS
(如果存在)代替任何现有的 GC 日志记录相关参数。
在上面,你可以改变{{hdfs_log_dir_prefix}}/$USER
到你希望 GC 日志去的任何地方(你可能希望它去与 NameNode 日志相同的地方)。您也可以更改日志文件命名。
如果您使用 Apache Ambari 管理 Hadoop 集群,那么这些更改将位于 HDFS 服务 > 配置 > 高级 > 高级 hadoop-env > hadoop-env 模板中。与 Ambari,{{hdfs_log_dir_prefix}}
将自动替换为该字段上方几行定义的 Hadoop 日志目录前缀。
GC 日志记录将在 NameNode 重启时开始。如果您拥有 NameNode HA 并且两个 NameNode 都在线,那么您可以一次重启一个而无需停机。
关于hadoop - 如何为 Apache Hadoop NameNode 启用 GC 日志记录,同时防止日志文件覆盖和限制磁盘空间使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859314/
如果所有 Namenode 都发生故障,Secondary namenode 的作用是什么? 最佳答案 在开始之前,我将解释一下 NN 和 SNN 的作用。 NameNode: 它包含数据节点的元数据
我正在尝试在 ec2-instance 上安装 Hadoop-2.6.0。 我下载并安装了 Hadoop。我还设置了环境变量。尝试启动 hdfs 服务时出现以下错误。 [ec2-user@ip-10-
您好,我在 HA 集群配置时间遇到了所有这些错误。请帮助我哪里错了。 14/09/08 11:13:38 INFO namenode.AclConfigFlag: ACLs enabled? fals
我按照以下链接中的步骤在我的 Ubuntu 12.04 中安装了 Hadoop。 http://www.bogotobogo.com/Hadoop/BigData_hadoop_Install_on_
当我尝试启动 DataNode 时出现此错误。据我所知,RPC 参数仅用于 HA 配置,我没有设置(我认为)。 2014-05-18 18:05:00,589 INFO [main] impl.Me
我在我的mac上安装了hadoop,我按照hadoop安装一步一步来 当我执行hdfs namenode -format hadoop 总是返回错误 无法找到或加载类 org.apache.hadoo
我知道之前有人问过这个问题,但我想不出解决方案。当我尝试运行 hdfs name node -format 时出现以下错误: Could not find or load main class org
我正在尝试使用在 Amazon EC2 上使用 Hadoop 和 HDFS 运行的 Dedoop 应用程序。 Hadoop 集群设置完毕,Namenode JobTracker 和所有其他守护进程都在
我是hadoop的新手,所以我有一些疑问。如果主节点发生故障,hadoop 集群会发生什么?我们能否在没有任何损失的情况下恢复该节点?是否可以保留一个辅助主节点在当前主节点发生故障时自动切换为主节点?
我试图用一个namenode和两个datanode(slave1和slave2)设置Hadoop Cluster,所以我从Apache Hadoop下载了zip文件,并将其解压缩到namenode和d
我试图用一个名称节点和四个数据节点配置 hadoop。我能够在一台机器上成功配置名称节点和作业跟踪器并将其启动。 但是在我要配置数据节点的机器上,我做了以下操作: 我将 hadoop-2.0.0-cd
如果我运行: sbin/start-dfs.sh 然后它实际上并没有启动一个名称节点尽管打印: Starting namenodes on [0.0.0.0] 0.0.0.0: starting na
我的第一个问题,我会尽量不把事情搞砸:) 出于学习目的,我正在 4 节点集群上安装 Hadoop 2.9.0。我已经按照官方 Apache Hadoop 2.9.0 文档和一些谷歌页面开始安装/配置名
我是新手,我正在尝试找到解决这个问题的方法。为了在 Ubuntu 15.10 上设置 Hadoop 2.7.2 http://idroot.net/tutorials/how-to-install-a
我在 OSX(单节点集群模式)上运行 Hadoop 1.2.1,除了 namenode 之外,一切似乎都在工作:当我运行 start-all.sh 时,namenode 无法运行。这个可以在运行sto
NameNode 有关NameNode的更多信息,请参阅HDFS。 表和区域的HDFS利用率 要确定HBase在HDFS上使用的空间大小,请使用NameNode中的hadoop shell命令。
我通过sqoop命令将数据从mysql成功上传到HDFS。 MySQL Hadoop集群有 1个名称节点 1个用于次要NameNode的节点 Jobtracker的1个节点 3个用于Datanade
我在配置 core-site.xml 文件中将端口更改为 9000 on 5000 并启动了一个脚本 ./hadoop namenode 结果我收到了以下消息(我只给出了从屏幕上看到的部分,因为在日志
我无法在 hadoop fs -ls/命令上查看我的 HDFS 中的文件,我认为这是因为名称节点未运行。我已尝试格式化名称节点以及更改核心站点中的端口.xml 到不同的值。我的 JPS 仍然没有列出
我刚刚开始从 Hadoop:权威指南 一书中学习 hadoop。 我按照伪分发模式下的 Hadoop 安装教程进行操作。我启用了 ssh 的无密码登录。在第一次使用之前格式化 hdfs 文件系统。第一
我是一名优秀的程序员,十分优秀!