关键过程日志如下...(将<user>替换为启动服务的用户,将<hostname>替换为机器名称)</hostname></user>

NameNode:_ $ HADOOP HOME / logs / hadoop- <user>-namenode- <hostname>.log</hostname></user>

DataNode:_ $ HADOOP HOME / logs / hadoop- <user>-datanode- <hostname>.log</hostname></user>

JobTracker:_ $ HADOOP HOME / logs / hadoop- <user>-jobtracker- <hostname>.log</hostname></user>

TaskTracker:_ $ HADOOP HOME / logs / hadoop- <user>-tasktracker- <hostname>.log</hostname></user>

HMaster:_ $ HBASE HOME / logs / hbase- <user>-master- <hostname>.log</hostname></user>

RegionServer:_ $ HBASE HOME / logs / hbase- <user>-regionserver- <hostname>.log</hostname></user>

ZooKeeper: TODO

129.1。记录位置

对于独立部署,日志显然将位于单个计算机上,但这只是一个开发配置。生产部署需要在群集上运行。

129.1.1。的 NameNode

NameNode 日志位于 NameNode 服务器上。 HBase Master 通常在 NameNode 服务器上运行,也可以在 ZooKeeper 上运行。

对于较小的集群,JobTracker / ResourceManager 通常也在 NameNode 服务器上运行。

129.1.2。数据管理部

每个 DataNode 服务器都有一个 HDFS 的 DataNode 日志,以及 HBase 的 RegionServer 日志。

此外,每个 DataNode 服务器还将具有用于 MapReduce 任务执行的 TaskTracker / NodeManager 日志。

129.2。日志级别

129.2.1。启用 RPC 级别日志记录

在 RegionServer 上启用 RPC 级别日志记录通常可以深入了解服务器的计时。启用后,记录的日志量很大。建议您不要将此登录时间保留超过短时间。要启用 RPC 级别日志记录,请浏览到 RegionServer UI 并单击 _ 日志级别 _。将包org.apache.hadoop.ipc的日志级别设置为DEBUG(对于hadoop.ipc,NOT,hbase.ipc,这是正确的。然后尾随 RegionServers 日志。分析。

要禁用,请将日志记录级别设置回INFO级别。

129.3。 JVM 垃圾收集日志

| |

本节中的所有示例垃圾收集日志都基于 Java 8 输出。在 Java 9 及更高版本中引入统一日志将导致看起来非常不同的日志。

|

HBase 是内存密集型的,使用默认的 GC 可以看到所有线程中的长暂停,包括 Juliet Pause 又名“GC of Death”。为了帮助调试或确认这种情况发生,可以在 Java 虚拟机中打开 GC 日志记录。

要在 hbase-env.sh 中启用,请取消注释以下行之一:

# This enables basic gc logging to the .out file.
# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps"

# This enables basic gc logging to its own file.
# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH>"

# This enables basic GC logging to its own file with automatic log rolling. Only applies to jdk 1.6.0_34+ and 1.7.0_2+.
# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M"

# If <FILE-PATH> is not replaced, the log file(.gc) would be generated in the HBASE_LOG_DIR. 

此时你应该看到这样的日志:

64898.952: [GC [1 CMS-initial-mark: 2811538K(3055704K)] 2812179K(3061272K), 0.0007360 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
64898.953: [CMS-concurrent-mark-start]
64898.971: [GC 64898.971: [ParNew: 5567K->576K(5568K), 0.0101110 secs] 2817105K->2812715K(3061272K), 0.0102200 secs] [Times: user=0.07 sys=0.00, real=0.01 secs] 

在本节中,第一行表示 CMS 最初标记的 0.0007360 秒暂停。这将暂停整个 VM,该段时间内的所有线程。

第三行表示“次要 GC”,它暂停 VM 0.0101110 秒 - 也就是 10 毫秒。它将“ParNew”从大约 5.5 米减少到 576k。在本周期的后期,我们看到:

64901.445: [CMS-concurrent-mark: 1.542/2.492 secs] [Times: user=10.49 sys=0.33, real=2.49 secs]
64901.445: [CMS-concurrent-preclean-start]
64901.453: [GC 64901.453: [ParNew: 5505K->573K(5568K), 0.0062440 secs] 2868746K->2864292K(3061272K), 0.0063360 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
64901.476: [GC 64901.476: [ParNew: 5563K->575K(5568K), 0.0072510 secs] 2869283K->2864837K(3061272K), 0.0073320 secs] [Times: user=0.05 sys=0.01, real=0.01 secs]
64901.500: [GC 64901.500: [ParNew: 5517K->573K(5568K), 0.0120390 secs] 2869780K->2865267K(3061272K), 0.0121150 secs] [Times: user=0.09 sys=0.00, real=0.01 secs]
64901.529: [GC 64901.529: [ParNew: 5507K->569K(5568K), 0.0086240 secs] 2870200K->2865742K(3061272K), 0.0087180 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
64901.554: [GC 64901.555: [ParNew: 5516K->575K(5568K), 0.0107130 secs] 2870689K->2866291K(3061272K), 0.0107820 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
64901.578: [CMS-concurrent-preclean: 0.070/0.133 secs] [Times: user=0.48 sys=0.01, real=0.14 secs]
64901.578: [CMS-concurrent-abortable-preclean-start]
64901.584: [GC 64901.584: [ParNew: 5504K->571K(5568K), 0.0087270 secs] 2871220K->2866830K(3061272K), 0.0088220 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
64901.609: [GC 64901.609: [ParNew: 5512K->569K(5568K), 0.0063370 secs] 2871771K->2867322K(3061272K), 0.0064230 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
64901.615: [CMS-concurrent-abortable-preclean: 0.007/0.037 secs] [Times: user=0.13 sys=0.00, real=0.03 secs]
64901.616: [GC[YG occupancy: 645 K (5568 K)]64901.616: [Rescan (parallel) , 0.0020210 secs]64901.618: [weak refs processing, 0.0027950 secs] [1 CMS-remark: 2866753K(3055704K)] 2867399K(3061272K), 0.0049380 secs] [Times: user=0.00 sys=0.01, real=0.01 secs]
64901.621: [CMS-concurrent-sweep-start] 

第一行表示 CMS 并发标记(查找垃圾)花费了 2.4 秒。但这是一个 _ 并发 _ 2.4 秒,Java 在任何时间点都没有被暂停。

还有一些较小的 GC,然后在最后一行停顿:

64901.616: [GC[YG occupancy: 645 K (5568 K)]64901.616: [Rescan (parallel) , 0.0020210 secs]64901.618: [weak refs processing, 0.0027950 secs] [1 CMS-remark: 2866753K(3055704K)] 2867399K(3061272K), 0.0049380 secs] [Times: user=0.00 sys=0.01, real=0.01 secs] 

这里的暂停是 0.0049380 秒(又名 4.9 毫秒)来“评论”堆。

此时扫描开始,您可以观察堆大小下降:

64901.637: [GC 64901.637: [ParNew: 5501K->569K(5568K), 0.0097350 secs] 2871958K->2867441K(3061272K), 0.0098370 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
...  lines removed ...
64904.936: [GC 64904.936: [ParNew: 5532K->568K(5568K), 0.0070720 secs] 1365024K->1360689K(3061272K), 0.0071930 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
64904.953: [CMS-concurrent-sweep: 2.030/3.332 secs] [Times: user=9.57 sys=0.26, real=3.33 secs] 

此时,CMS 扫描需要 3.332 秒,堆从大约 2.8 GB 到大约 1.3 GB(近似值)。

这里的关键点是保持所有这些暂停低。 CMS 暂停总是很低,但如果您的 ParNew 开始增长,您可以看到较小的 GC 暂停接近 100 毫秒,超过 100 毫秒并达到 400 毫秒。

这可能是由于 ParNew 的大小,它应该相对较小。如果你的 ParNew 在运行 HBase 一段时间后非常大,在一个例子中 ParNew 大约是 150MB,那么你可能不得不约束 ParNew 的大小(它越大,集合采取的时间越长但是如果它太小,对象太快被提升为老一代)。在下面我们将新的基因大小限制在 64 米。

hbase-env.sh 中添加以下行:

export SERVER_GC_OPTS="$SERVER_GC_OPTS -XX:NewSize=64m -XX:MaxNewSize=64m" 

同样,要为客户端进程启用 GC 日志记录,请取消注释 hbase-env.sh 中的以下行之一:

# This enables basic gc logging to the .out file.
# export CLIENT_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps"

# This enables basic gc logging to its own file.
# export CLIENT_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH>"

# This enables basic GC logging to its own file with automatic log rolling. Only applies to jdk 1.6.0_34+ and 1.7.0_2+.
# export CLIENT_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M"

# If <FILE-PATH> is not replaced, the log file(.gc) would be generated in the HBASE_LOG_DIR . 

有关 GC 暂停的更多信息,请参阅 Todd Lipcon 的 3 部分博客文章和上面的 Long GC 暂停