故障排除和調(diào)試HBase:日志

2018-10-10 16:48 更新

日志

關(guān)鍵進(jìn)程日志如下...(將<user>替換為啟動(dòng)服務(wù)的用戶,將<hostname>替換為計(jì)算機(jī)名稱(chēng))

NameNode:$ HADOOP_HOME / logs / hadoop- <user> -namenode- <hostname> .log

DataNode:$ HADOOP_HOME / logs / hadoop- <user> -datanode- <hostname> .log

JobTracker:$ HADOOP_HOME / logs / hadoop- <user> -jobtracker- <hostname> .log

TaskTracker:$ HADOOP_HOME / logs / hadoop- <user> -tasktracker- <hostname> .log

HMaster:$ HBASE_HOME / logs / hbase- <user> -master- <hostname> .log

RegionServer:$ HBASE_HOME / logs / hbase- <user> -regionserver- <hostname> .log

ZooKeeper:TODO

日志位置

對(duì)于獨(dú)立部署,日志顯然將位于單個(gè)計(jì)算機(jī)上,但這只是一個(gè)開(kāi)發(fā)配置。生產(chǎn)部署需要在群集上運(yùn)行。

NameNode

NameNode日志位于NameNode服務(wù)器上。HBase Master通常在NameNode服務(wù)器上運(yùn)行,也可以在ZooKeeper上運(yùn)行。

對(duì)于較小的群集,JobTracker/ResourceManager通常也在NameNode服務(wù)器上運(yùn)行。

DataNode

每個(gè)DataNode服務(wù)器都有一個(gè)HDFS的DataNode日志,以及HBase的RegionServer日志。

此外,每個(gè)DataNode服務(wù)器還將具有用于MapReduce任務(wù)執(zhí)行的TaskTracker/NodeManager日志。

日志級(jí)別

啟用RPC級(jí)別日志記錄

在RegionServer上啟用RPC級(jí)別日志記錄通??梢陨钊肓私夥?wù)器的計(jì)時(shí)。啟用后,記錄的日志量很大。建議您不要將此登錄時(shí)間保留在短時(shí)間。要啟用RPC級(jí)別日志記錄,請(qǐng)瀏覽到RegionServer UI并單擊“日志級(jí)別”。將日志級(jí)別設(shè)置為包org.apache.hadoop.ipc的DEBUG(這對(duì)于hadoop.ipc這是正確的,對(duì)于hbase.ipc不是)。然后尾隨RegionServers日志、分析。

要禁用,請(qǐng)將日志記錄級(jí)別設(shè)置回INFO級(jí)別。

JVM垃圾回收日志

本節(jié)中的所有示例垃圾回收日志都基于Java 8輸出。在Java 9和更新版本中引入統(tǒng)一的日志記錄將導(dǎo)致非常不同的日志。

HBase是內(nèi)存密集型的,使用默認(rèn)的GC可以看到所有線程中的長(zhǎng)時(shí)間暫停,包括Juliet Pause又名“GC of Death”。為了幫助調(diào)試或確認(rèn)發(fā)生這種情況,可以在Java虛擬機(jī)中打開(kāi)GC日志記錄。

要在hbase-env.sh中啟用,請(qǐng)取消注釋以下行之一:

# 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.

此時(shí)你應(yīng)該看到這樣的日志:

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]

在本節(jié)中,第一行表示CMS最初標(biāo)記的0.0007360秒暫停。這將暫停整個(gè)VM,該段時(shí)間內(nèi)的所有線程。

第三行表示“次要GC”,暫停VM 0.0101110秒 - 也就是10毫秒。它將“ParNew”從大約5.5m減少到576k。在這個(gè)循環(huán)的后期,我們看到:

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并發(fā)標(biāo)記(查找垃圾)花費(fèi)了2.4秒。但這是一個(gè)并發(fā)的2.4秒,Java在任何時(shí)候都沒(méi)有被暫停。

還有一些較小的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毫秒)來(lái)“注釋”堆。

此時(shí)掃描開(kāi)始,您可以觀察到堆大小下降:

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]

此時(shí),CMS掃描需要3.332秒,堆從大約2.8 GB到大約1.3 GB(近似值)。

這里的關(guān)鍵點(diǎn)是保持所有這些暫停低。CMS暫??偸呛艿?,但如果您的ParNew開(kāi)始增長(zhǎng),您可以看到較小的GC暫停接近100ms,超過(guò)100ms并達(dá)到400ms的高位。

這可能是由于ParNew的大小,它應(yīng)該相對(duì)較小。如果你的ParNew在運(yùn)行HBase一段時(shí)間后非常大,在一個(gè)例子中ParNew大約是150MB,那么你可能不得不約束ParNew的大?。ㄋ酱?,集合采取的時(shí)間越長(zhǎng),但是如果它太小,對(duì)象太快被提升為老一代)。在下面我們將新的基因大小限制在64m。

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

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

同樣,要為客戶端進(jìn)程啟用GC日志記錄,請(qǐng)取消注釋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 .
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)