暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hbase regionserver服务重启后region加载慢问题分析

IT那活儿 2021-05-15
3423

某大数据项目批处理集群hbase出现查询超时,应客户和应用侧要求,重启了hbase服务。重启hbase后,在加载region的时候速度较慢,导致日志中心业务无法正常写入、数据汇聚业务无法正常读取。

由于应用侧反馈无法正常查询hbase表,因此和客户及应用侧协商确认后,针对hbase修改hbase.hstore.compaction.max=30参数,然后重启hbase集群。

重启后发现hbase加载region很慢,登入hbase集群后从后台查看hbase表发现很多表region未上线,后台查询hbase表失败。

查看hmaster ui界面发现很多region处于regions in transition状态。且重启前region数正常有7.5w左右,而目前加载的只有2w7左右。

排查hmaster日志,发现hbase正在做major compact和balance,且compact持续了很久,日志中显示region注册时,从hdfs上获取block失败,导致大量的skip信息。

恢复配置,重新重启hbase集群,发现重启仍然很慢。

全部停止hbase集群,只启动hbase master节点上的的hmaster服务,然后重启regionserver,发现重启仍然很慢,查看日志,发现master初始化超时失败:

修改参数

hbase.master.namespace.init.timeout=36000000

hbase.master.initializationmonitor.timeout=48000000

参数调整完毕后,重新启动整个hbase(只启动226节点的hmaster),等待region加载上线。

后台测试hbase,新建表和读写都正常,日志中心业务恢复正常,但针对部分历史大数据量的表读写仍然失败。

查看region,仍有处于RIT状态的:

针对部分上线困难的region使用assign 'regionname'命令手动上线:

经过处理后,region全部加载完成,没有发现处于RIT状态的region,hbase及其业务全部恢复正常。

故障原因

  1. hbase重启时,由于hfile文件较多,导致调整hbase.hstore.compaction参数后,产生大量的compaction.

  2. hbase重启时,hbase在做region rebalance和split,进一步加剧了集群的负担,最终导致重启缓慢。

遗留问题

  1. hbase集群region数较多,平均每个regionserver节点已经超过350个region。

  2. hbase balance策略需要调整,rebalance一段时间后,又会分部不均。

改进措施

  1. 制定hbase定期巡检计划,完善现有监控指标,实时掌握hbase集群健康情况。

  2. 随着hbase接入应用和数据的增加,定期和应用厂商反馈各方对hbase的使用情况,并要求应用定期对过期表进行清理。

  3. 常用hbase表建议应用使用天表。

  4. 改进hbase rebalance策略,确保regionserver上region均衡分部。

结合此次故障暴露出的问题,我们总结了Hbase模型设计方面的一些规范和建议:

  • HBase在新建一个表时如果不指定预分配Region,则默认为该表只分配一个Region。在数据加载时,所有数据都会加载到该Region,导致单节点负载过高,加载性能降低,从而影响入库性能。因此需要在建表时预先为该表在所有节点上分配多个Region,从而将所有节点高效利用起来。

  • 预建Region的个数需要根据话单文件大小和节点个数来确定。由于每个Region大小超过一定数值后,HBase会自动进行Region分裂,导致Region不均匀,使得各台节点的压力不均,影响HBase的性能,因此预建Region的基本原则是尽量避免Region的自动分裂。

  • 根据最佳实践经验,每个RegionServer上的Region个数为100左右的情况下HBase性能最好。因此每张表预建的Region数目应当小于等于100*RegionServer个数/表的个数。同时每个Region的文件大小(hbase.hregion.max.filesize)推荐配置为10GB,并在每天晚上空闲时对表做major_compact处理,以提高HBase的查询性能。

  • 访问模式是HBase设计的主要部分,弄清应用将如何访问数据,识别被访问的数据类型。大多数应用可以分成读操作密集或写操作密集两种,以及读写均密集型,需要针对不同的访问模型来设计不同的rowkey。

  • 使用salted或promoted字段行键可以在写的分布和顺序读取得较好的平衡,如果你只做随机读,使用随机key是最合理的。可以避免region的热点问题。

END

更多精彩干货分享

点击下方名片关注

IT那活儿

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论