HBase经典案例集锦一:读写慢(2-8):单节点datanode故障导致HBase查询慢
【摘要】 【问题描述】HBase业务查询超时。【分析过程】 分析regionserver日志所有打印查询业务表的scan请求的responseTooSlow信息前都有连接x.x.x.203节点dn实例失败的日志;检查对应的dn日志,dn实例进程在19:44:41停止,21:18:19启动,根据一线反馈该节点因为告警节点故障19:44做了主机隔离;根据nn日志分析19:56:39 nn将隔离节点dn实例...
【问题描述】
HBase业务查询超时。
【分析过程】
- 分析regionserver日志所有打印查询业务表的scan请求的responseTooSlow信息前都有连接x.x.x.203节点dn实例失败的日志;
- 检查对应的dn日志,dn实例进程在19:44:41停止,21:18:19启动,根据一线反馈该节点因为告警节点故障19:44做了主机隔离;
- 根据nn日志分析19:56:39 nn将隔离节点dn实例标记为dead状态,但是19:44到21:18之间一直有regionserver连接该节点读取数据块,因为连接该实例失败重新获取块信息导致HBase业务部分查询慢;
- 测试环境测试关闭短路读(增大跨节点读取数据概率)后持续查询该问题复现;
- RegionSever创建Scanner后会调用readBlockData通过FSDataInputStream读取HDFS上的数据;
- 如果不是短路读,调用getRemoteBlockReaderFromTcp方法进行查询;
- 查询时会调用fetchBlockAt方法获取block位置,优先到DFSInputStream缓存中查找(缓存在regionserver侧,HDFS客户端的缓存),找不到再到namenode去获取同时更新缓存中datanode的信息数据。
- dn节点故障后DFSInputStream中缓存的block信息在没有请求到该block时是不会更新的,所以读取时还是会连接到故障dn节点,连接失败后才会去nn中获取其他块的位置。
【问题根因】
dn实例宕机后regionsever侧region中DFSInputStream缓存中的块信息没有更新,读取数据时还是会从缓存中获取到故障实例上的块信息,连接故障节点失败后去nn中获取其他块的位置并连接新节点导致查询变慢。
【规避方法】
1. 表数据是通过bulklaod方式导入的,数据本地化占比小,建议对表定期执行 major_compact 'ldx:nagf_cst_pd_profit_dmts',增大表数据本地化概率;
2. dn节点扩容regionserver实例,增大hbase数据本地化概率。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)