HBase经典案例集锦一:读写慢(2-8):单节点datanode故障导致HBase查询慢

举报
zhiru 发表于 2022/12/23 17:50:13 2022/12/23
【摘要】 【问题描述】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业务查询超时。

【分析过程】

    1.  分析regionserver日志所有打印查询业务表的scan请求的responseTooSlow信息前都有连接x.x.x.203节点dn实例失败的日志;
    2. 检查对应的dn日志,dn实例进程在19:44:41停止,21:18:19启动,根据一线反馈该节点因为告警节点故障19:44做了主机隔离;
    3. 根据nn日志分析19:56:39 nn将隔离节点dn实例标记为dead状态,但是19:44到21:18之间一直有regionserver连接该节点读取数据块,因为连接该实例失败重新获取块信息导致HBase业务部分查询慢;
    4. 测试环境测试关闭短路读(增大跨节点读取数据概率)后持续查询该问题复现;
    5.  RegionSever创建Scanner后会调用readBlockData通过FSDataInputStream读取HDFS上的数据;
    6. 如果不是短路读,调用getRemoteBlockReaderFromTcp方法进行查询; 
    7. 查询时会调用fetchBlockAt方法获取block位置,优先到DFSInputStream缓存中查找(缓存在regionserver侧,HDFS客户端的缓存),找不到再到namenode去获取同时更新缓存中datanode的信息数据。
    8. 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

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。