Table of Contents generated with DocToc
- 107. 一般准则
- 108. 日志
- 109. 资源
- 110. 工具
- 111. Client
- 111.1 hbase.client.scanner.max.result.size在客户端和服务器之间的不匹配导致错误的扫描结果
- 111.2 ScannerTimeoutException 或 UnknownScannerException
- 111.3 Thrift 和 Java API 的性能差异
- 111.4
Scanner.next引发的LeaseException - 111.5 正常操作触发的异常
- 111.7 安全的客户端连接
- 111.8 ZooKeeper 客户端连接错误
- 111.9 客户端超内存,尽管堆大小很稳定
- 111.10 调用 Admin 方法时的 Client slowdown
- 111.11 安全客户端无法连接
- 112. MapReduce
- 113. NameNode
始终从 Master 的日志开始查看。通常它总会反复地打印同一行,Google 它总会获得一些提示。
如果 HBase 里面有成百个异常和堆栈信息,通常都会有个开始的位置。仔细查阅它!
Region 自杀是很正常的,如果 ulimit 和 线程数没有设置好,HBase 就不能访问文件系统的文件了。另一种情况,多长的 GC 触发了 ZooKeeper session 的超时。
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
单机模式的 HBase,日志都在同一个机器上。但在生产模式,HBase 必须是运行在集群上的。
NameNode 日志在 NameNode 服务器上。HBase Master 通常在 NameNode 服务器 和 ZooKeeper 上运行。
对于较小的集群,JobTracker/ResourceManager 通常也在 NameNode 服务器上运行。
每个 DataNode 服务器,都有一个相对 HDFS 的 DataNode 日志、一个相对于 HBase 的 RegionServer 日志。
此外,每个 DataNode 服务器还有一个TaskTracker / NodeManager日志,用于MapReduce任务执行
在RegionServer上启用RPC级日志记录可以了解服务器上的时序。一旦启用,日志数量会剧增,故不建议开启太长时间。
要启用RPC级日志记录,请浏览到 RegionServer UI,然后单击日志级别。将日志级别设置为包org.apache.hadoop.ipc(不是hbase.ipc)的DEBUG。然后tail RegionServers日志。分析。
要禁用,请将日志记录级别设置回INFO级别。
HBase 对内存很敏感,使用默认的 GC 会造成长时间的暂停。
打开 GC 日志:
# 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.接着你应该能看到如下的 GC 日志:
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秒的暂停。第三行,一次minor GC造成了 0.0101110 的暂停。
同样,开启客户端的 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 .search-hadoop.com 索引了所有的邮件列表,可用于历史搜索。遇到 HBase 相关的问题,应该首先求助这里。
在 Apache HBase mailing lists 提问。dev 邮件列表,旨在构建 HBase 的新 feature。user列表用于发布 HBase 版本的问题。
使用邮件列表前,在 search-hadoop.com 上确认先前没有类似问题。花些时间想好问题,一个高质量的问题,应该包括上下文、尝试寻求答案的证据等等。
http://apache-hbase.slack.com 上看看 Slack 的 channel。
(You will probably get a more prompt response on the Slack channel)
hbase on irc.freenode.net
从 JIRA 找 Hadoop/HBase 相关的 issue。
Master 默认以 16010 为 Web 接口。
Master 的 Web 界面列出了表及其定义(列族、blocksize等)、RegionServer。
从 Master 的 Web UI 可以跳转到每个 RegionServer 的 UI。
RegionServer 默认以 16030 为 Web 接口。
RegionServer Web UI 列出了在线的 region 及其起止key、RegionServer 的指标(请求、region、compactionQueueSize等)
zkcli用来定位 ZooKeeper 相关的 issue:
./hbase zkcli -server host:port <cmd> <args>tail -f xxx.log-f 自动刷新打开的文件。
top 用来查看机器的资源占用情况。
SWAP 意味着频繁的交换活动,这是 Java 性能恶化的标识。
top 只能看出来 Java 程序的资源占用,要想知道是哪一个进程,按c。
jps 显示当前用户的每个 Java 进程的 ID。
jstack 能够看出一个 Java 进程在看什么。它必须与 jps 命令结合使用,以获取进程 ID。它会显示一个线程列表。
OpenTSDB 是 Ganglia 的绝佳替补,它使用 HBase 来存储所有的时间序列,而不必下调采样率。
穷人的监控系统,容易设置,对于几台机器来说足够了。
More information:client
如果客户端或服务器版本低于0.98.11/1.0.0,并且服务器的 hbase.client.scanner.max.result.size 的值比客户端要小,则到达服务器且超过hbase.client.scanner.max.result.size 请求可能会丢失数据。
特殊地,0.98.11 的 hbase.client.scanner.max.result.size 默认是2MB,其他版本的默认值更大点。
如果从客户端到RegionServer的RPC调用之间的时间超过扫描超时,则抛出此异常。例如,如果Scan.setCaching设置为500,那么next()调用都会产生一个 RPC 请求,获取下一批500行数据。
减少setCaching值是一个选择,但是将该值设置得太低可能更加低效。
如前所述,Scan.setCaching 设置过大会产生性能问题。Thrift 客户端也是一样。
Thrift 客户端使用scannerGetList(scannerId, numRows)来设置缓存。
LeaseException 经常发生在一个缓慢/冻结的RegionServer#next调用中。通过 hbase.rpc.timeout > hbase.regionserver.lease.period 可以防止它。
See more:HBase, mail # user - Lease does not exist exceptions
0.20.0 之后,默认的org.apache.hadoop.hbase.*日志级别为 DEBUG。
你可以在客户端,打开$HBASE_HOME/conf/log4j.properties更改它。
客户端将大量数据插入到未优化的HBase集群中。压缩可能加剧停顿,虽然它不是问题的根源。
- 首先确保, 所有数据不是打向单个 region。
- 检查配置
hbase.hstore.blockingStoreFiles,hbase.hregion.memstore.block.multiplier,MAX_FILESIZE(region size), 和MEMSTORE_FLUSHSIZE。
根本原因是小文件太多,等待 compact。
See more:Long client pauses with compression
Secure Client Connect ([Caused by GSSException: No valid credentials provided
(Mechanism level: Request is a replay (34) V PROCESS_TGS)])
上述异常是 MIT Kerberos 的replay_cache组件的 bug。你可以忽略这个异常,因为客户端会重试 34 次,直到 IOException。
11/07/05 11:26:41 WARN zookeeper.ClientCnxn: Session 0x0 for server null,
unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1078)
11/07/05 11:26:43 INFO zookeeper.ClientCnxn: Opening socket connection to
server localhost/127.0.0.1:2181
11/07/05 11:26:44 WARN zookeeper.ClientCnxn: Session 0x0 for server null,
unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1078)
11/07/05 11:26:45 INFO zookeeper.ClientCnxn: Opening socket connection to
server localhost/127.0.0.1:2181
上述异常,要么是 ZooKeeper 挂了,要么是因为网络原因不可用了。
使用 zkcli 可以定位 ZooKeeper 的问题。
HBase, mail # user - Suspected memory leak
HBase, mail # dev - FeedbackRe: Suspected memory leak
workaround 是使用-XX:MaxDirectMemorySize传给客户端 JVM 一个合理的值。默认情况下,MaxDirectMemorySize等于-Xmx。把它设置小一点,但过小会触发 FullGC。
HBASE-5073 fix 了这个 bug。
起因,客户端有一个ZooKeeper漏洞,客户端调用 Admin API 的时候会被ZooKeeper事件淹没。
Caused by GSSException: No valid credentials provided(Mechanism level: Failed to find any Kerberos tgt)
- 检查 Kerberos ticket 是否有效。
- 查看 Java Security Guide troubleshooting section
- 根据 Kerberos 配置,安装 Java Cryptography Extension。
使用 ImportTsv 时,可能会出现以下问题:
WARN mapred.LocalJobRunner: job_local_0001
java.lang.IllegalArgumentException: Can't read partitions file
at org.apache.hadoop.hbase.mapreduce.hadoopbackport.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:111)
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:560)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:639)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210)
Caused by: java.io.FileNotFoundException: File _partition.lst does not exist.
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:383)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:251)
at org.apache.hadoop.fs.FileSystem.getLength(FileSystem.java:776)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1424)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1419)
at org.apache.hadoop.hbase.mapreduce.hadoopbackport.TotalOrderPartitioner.readPartitions(TotalOrderPartitioner.java:296)
LocalJobRunner 意味着作业运行在本地,而不是集群。
解决这个问题,得让HADOOP_CLASSPATH包括 HBase 的依赖:
HADOOP_CLASSPATH=`hbase classpath` hadoop jar $HBASE_HOME/hbase-server-VERSION.jar rowcounter usertable
启动 Spark 作业时,也会有这个 issue:HBASE-10877 HBase non-retriable exception list should be expanded
See more: HDFS