HBase之Slow log

本文详细介绍了HBase的Slowlog功能,包括如何配置响应时间和数据大小的阈值,以及如何通过内存环形缓冲区和系统表进行日志存储和管理。涵盖了内存存储配置、表存储机制以及获取和分析慢查询日志的方法。

Slow log

hbase会记录慢查询日志,关键字包括responseTooSlow、responseTooLarge、operationTooSlow、and operationTooLarge。

记录条件

响应时间和响应的数据大小可由以下参数配置

  • hbase.ipc.warn.response.time :查询运行超过该值的时间(毫秒),将被日志记录。默认10s,设置为-1则禁用日志记录
  • hbase.ipc.warn.response.size :查询返回的数据超过该值(字节),将被日志记录。默认100M,设置为-1则禁用日志记录

日志示例

在这里插入图片描述
response相关字段默认会被截断,导致某些关键信息缺失
在这里插入图片描述

配置内存存储

用于配置一个环形缓冲区来存储

hbase.regionserver.slowlog.buffer.enabled=true
hbase.regionserver.slowlog.ringbuffer.size=配置缓冲区的大小

开启环形缓冲区后,可以从shell获取慢日志

// 获取所有rs的慢日志记录
hbase> get_slowlog_responses '*' 
// 获取某一rs的记录
hbase> get_slowlog_responses host187.example.com,60020,1289493121758
// 获取给定client ip的慢记录
hbase> get_slowlog_responses '*', {'CLIENT_IP' => '192.162.1.40:60225', 'LIMIT' => 100}
获取超限日志 使用get_largelog_responses命令

配置表存储

缓冲区会被覆盖,同时需要系统表来持久化存储。
每个regionserver会启动一个cron作业,从队列中检索日志并插入系统表。

hbase.regionserver.slowlog.systable.enabled=true 
日志会存储到系统表hbase:slowlog
hbase.slowlog.systable.chore.duration=10min 
间隔时间
hbase.regionserver.slowlog.systable.queue.size=1000
regionserver存储的条数,默认1000

系统表列族info,包含以下列

  • info:call_details
  • info:client_address
  • info:method_name
  • info:param
  • info:processing_time
  • info:queue_time
  • info:region_name
  • info:response_size
  • info:server_class
  • info:start_time
  • info:type
  • info:username
<think>我们正在讨论的是命令中的 `tee logs/check_hbase0.log` 部分。这个命令是在一个通过SSH执行的复合命令中出现的: `cd /opt/con_auto_test;sh common_sh_main.sh ndp-hbase-master-0 check_hbase.sh 2>&1 | tee logs/check_hbase0.log` 在这个命令中,`tee` 是一个常用的Linux命令,它的作用是将标准输入的内容同时输出到标准输出和指定的文件中。 具体分解: 1. 整个命令首先切换到目录 `/opt/con_auto_test`。 2. 然后执行脚本 `common_sh_main.sh`,并传递了三个参数:`ndp-hbase-master-0`、`check_hbase.sh`。 3. 命令中的 `2>&1` 表示将标准错误(文件描述符2)重定向到标准输出(文件描述符1),这样错误输出和标准输出都会一起被处理。 4. 然后通过管道(`|`)将上一步的输出传递给 `tee logs/check_hbase0.log`。 `tee` 命令的作用: - 将管道传递过来的内容(即上一步命令的标准输出和标准错误)写入到文件 `logs/check_hbase0.log` 中(同时创建该文件或覆盖已有内容)。 - 同时,这些内容也会继续输出到标准输出(即控制台)。 因此,使用 `tee` 的好处是: - 我们可以将命令的输出保存到文件中,便于后续查看日志。 - 同时,在命令执行过程中,我们还能在终端上实时看到输出。 在这个上下文中,`execResult1.get("result")` 应该就是捕获了命令执行过程中输出到标准输出的内容(因为使用了管道,`tee` 会将内容输出到标准输出,所以可以被Java程序捕获)。而文件 `logs/check_hbase0.log` 则保存了相同的输出内容,这样即使Java程序没有捕获到,我们也可以去服务器上查看这个日志文件。 另外,注意命令中使用了相对路径 `logs/check_hbase0.log`,由于之前已经切换到了 `/opt/con_auto_test` 目录,所以这个日志文件将创建在 `/opt/con_auto_test/logs/` 目录下。 总结: - `tee` 命令用于将输入同时输出到文件和标准输出。 - 在这个例子中,它保存了脚本执行的输出到日志文件,同时让输出能够被Java程序捕获。 关于引用:在回答中,我们没有直接使用到提供的引用[1]和[2],因为它们讨论的是YARN日志聚合和NQ日志,与当前问题无关。因此,我们不需要添加引用标识。 现在,我们可以按照要求生成相关问题。</think>### `tee logs/check_hbase0.log` 命令详解 #### 一、命令作用 `tee logs/check_hbase0.log` 是一个Linux管道命令,主要实现**双重输出功能**: 1. **实时显示输出**:将命令执行结果实时显示在终端 2. **同步保存日志**:将完整输出内容保存到指定日志文件(`logs/check_hbase0.log`) 在您的代码中: ```bash sh common_sh_main.sh ... 2>&1 | tee logs/check_hbase0.log ``` - `2>&1`:将标准错误(stderr)重定向到标准输出(stdout) - `|`:管道符,将前序命令输出传递给`tee` - `tee`:分流器,同时输出到屏幕和文件 #### 二、工作流程 ```mermaid graph LR A[脚本执行] --> B[stdout/stderr输出] B --> C{tee命令} C --> D[终端显示] C --> E[日志文件 logs/check_hbase0.log] ``` #### 三、关键优势 1. **实时监控**:运维人员可实时观察脚本执行进度 2. **持久化存储**:完整记录执行过程,便于后续: - 故障排查(如HBase启动失败) - 审计追踪 - 性能分析 3. **错误捕获**:通过`2>&1`确保错误信息不被遗漏 #### 四、在HBase验证中的具体应用 在您的代码中: ```java sshBaseAction.sshdUtil.runCommandExec( "cd /opt/con_auto_test;sh common_sh_main.sh ... 2>&1 | tee logs/check_hbase0.log", 600000 ); ``` 1. **日志保存路径**:`/opt/con_auto_test/logs/check_hbase0.log` 2. **日志内容**: - HBase状态检查输出(`Ret: Success`) - 可能的错误堆栈信息 - 详细调试信息 3. **后续使用**: ```java // 1. 验证关键输出 Assert.verify(String.valueOf(execResult1.get("result")).contains("Ret: Success")); // 2. 记录完整日志 ReportLog.info(String.valueOf(execResult1.get("result"))); ``` #### 五、典型问题解决方案 当遇到`Logs not available`错误时(如引用[1]): 1. 检查日志目录权限: ```bash ls -ld /opt/con_auto_test/logs ``` 2. 确保磁盘空间充足: ```bash df -h /opt ``` 3. 配置日志聚合(参考引用[1]的YARN方案): ```xml <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> ``` #### 六、运维最佳实践 1. **日志轮转**:添加`logrotate`配置避免磁盘占满 2. **日志分级**:区分INFO/WARN/ERROR级别 3. **集中管理**:集成ELK(Elasticsearch+Logstash+Kibana)实现: - 日志聚合(如引用[2]的NQ日志方案) - 关键事件告警 - 可视化分析 --- ### 相关问题 1. 如何在Java中实时解析`tee`命令生成的日志文件? 2. 当日志文件过大导致磁盘空间不足时,有哪些自动清理策略? 3. 如何通过SSH命令同时将日志输出到多个文件? 4. `2>&1`和`2>/dev/null`在错误处理上有何本质区别? 5. 在分布式系统中如何实现跨节点的日志聚合?[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值