最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。这里描述一整个过程——
事情的起因:业务方按照userid和商品id作为rowkey前缀,并没有进行hash散列。我当时咨询过业务方,认为:1.业务方式按照oracle的rowid顺序来进行迁移的,相对来说对应到rowkey里面就不会集中化;2.即使出现部分集中的情况,hbase也能够通过自动split来hold住写入。
结果线上写入的时候,12台机器的情况下业务方写入达到50~60w tps,基本上5w tps每台的写入速度。开始的时候region还能够自动split,比较好,写入速度也能够保持,但是到了第二天,发现写入在region维度的分布很不均衡,于是查看表的region size 情况,有一个region数据量特别大——800GB,700+个文件。
这里也分析一下为什么hbase会让这么大的region存在,其实这块hbase的控制机制也是值得商榷的。首先,大量的写入会刷大量的HFile,一个region就会对这大量的hfile进行compact操作。如果这时候触发了split操作,这个region会成为父region,而两个子region会保留父region的引用文件。而在这其间,子region会继续写入数据。那么又可能触发子region的compact,这里的关键点来了——子region如果做compact的文件都是新写入的文件,而迟迟不去compact父region 引用的文件,会导致一个问题——就是这个子region无法被split掉了(因为含有父region引用的region是不能被split的)。那么子region越来越大,由于写入文件数量急剧增长,父region的ref文件总也得不到机会compact,就形成了大region的恶性循环情况——由于region太大,compact无法完成,但是由于compact无法完成导致region无法split,无法分摊compact的压力给其他regionserver。当然还得加上最后一点外部大量的写入没有停止——这里我们通常理解,hbase有一个参数hbase.hstore.blockingStoreFiles=30,当region下的hfile达到30个的时候是会阻塞写的。那我都bolck住写了,为什么region里hfile会到700这么多呢?原来还有另一个参数hbase.hstore.blockingWaitTime=30000.hbase考虑到对应用的影响不会长时间block住写,30秒后会恢复。
这里天梧有提一个改进的compact算法,优先去compact从父region引用过来的hfile,让region有split的可能,能在一定程度上缓解这个问题http://kelude.taobao.net/issues/543434 ,这个方法我使用过,只能在一定程度上缓解问题,对于800G大小的region,一天都没有compact掉。所以只适合100G以内的region,并且这时候业务方还不能有大量的写操作。但有趣的是一般如此程度的写入压力都是在业务方新导入数据的时候造成的,所以和业务方沟通一下让他们重导数据比自己慢慢郁闷的compact这个大region来的要快的多。但是在重新导之前就要好好改进一下了:
这里总结一下这个问题,对于大批量导入数据,1、还是必须让业务方对rowkey进行预分片,对业务数据rowkey进行md5或者其他的hash策略,让数据尽量随机分布而不是顺序写入。2、随时观察region的大小,是否出现大region的情况。
这个问题预防为主,如果出现大region——优先考虑重导数据,其次使用patch。
相关推荐
【HBASERegion数量增多问题描述及解决方案】 在HBase分布式数据库中,Region是表数据的基本存储单元,它将表的数据按照ROWKEY的范围进行分割。随着数据的增长,一个Region会分裂成两个,以此来确保数据的均衡分布。...
这有助于防止单个Region过大导致的写入和查询性能下降。Split过程包括以下步骤: - **检测条件**:当Region中的数据量接近预设的最大大小(例如,1GB)时,HBase会触发分裂操作。 - **选择分裂点**:HBase会选择一...
HBase通过Region Split来解决这个问题,将大的Region分割成两个较小的部分,确保数据分布均匀。Split过程是透明的,对上层应用无感知。 2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region...
当一个Region的大小达到预设阈值时,`org.apache.hadoop.hbase.regionserver.HRegion`会触发分裂过程,这涉及到`org.apache.hadoop.hbase.regionserver.SplitTransaction`类的使用,确保分裂过程中数据的一致性。...
- RegionSplit后的管理:当一个Region的大小超过设定的阈值时,会将其分割成两个新的Region。 - 故障转移:当某个RegionServer出现故障时,HMaster会将该RegionServer上的Region重新分配到其他健康的RegionServer...
当region文件大小达到由“hbase.hregion.max.filesize”参数决定的上限(默认256MB),触发region split操作,原region一分为二,以提高数据读写效率与分布均衡性。 在此过程中,“.splits”目录的引入,有效避免了...
至于memstore的大小,小region在设置时有更大的灵活性,可以根据应用的写入频率和数据量进行精细化调整。大region可能需要较大的memstore来避免频繁flush,但也要注意内存使用限制。 除了上述参数,还有其他如`...
当rowkey顺序递增,且不进行预分区时,可能会出现写热点,所有写操作都集中在最大start-key所在的region,导致资源消耗过大和split次数增多。 为了解决热点问题,一种常用的方法是结合预分区和随机散列。通过在...
在HBase中,默认情况下,在创建表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这个region写数据,直到这个region足够大了才进行切分。为了加快批量写入速度,可以通过预先创建一些空的...
### HBase源码分析 #### 一、HBase性能测试要点与分析 ##### 1.1 测试环境 - **硬件配置**: - 客户端:1台 - RegionServer:5台 - Master:1台 - ZooKeeper:3台 - **软件配置**: - CPU:每台服务器配备8...
- 若集群需支持的总数据量较大,单个Region设置得过小又会导致Region数目过多,增加管理开销。 - 在特定情况下,可以考虑增大该值,并在建表时规划好Region的数量和RowKey的设计,预先创建Region,确保在一定时间...
可以通过调整RegionServer配置、优化RegionSplit策略等方式来缓解。 - **RegionServer OOM**:当行的版本过多或者RowKey设计不合理时,可能导致RegionServer内存溢出。可以通过减少版本数量、优化RowKey设计等方法...
8. **Region Split和Merge**:当Region大小达到预设阈值时,HBase会自动分裂Region以保持性能。源码中,`org.apache.hadoop.hbase.regionserver.SplitTransaction`类处理Region的分裂操作。另外,`org.apache.hadoop...
在多列族场景下,如果数据分布不均,可能会导致不必要的Split操作,引发效率问题。例如,大列族的Split会连带触发小列族的Flush,造成额外的IO开销,长期下来严重影响Scan查询的效率。 综上所述,HBase的存储模型...
同时,RegionServer还承担着区域的分割(即Region Split)任务。为了提高效率和一致性,RegionServer通常与HDFS的DataNode部署在同一台机器上。 - **Region**:逻辑上的分区,每个Region包含一定范围的行键(RowKey...
- **Region概念**: HBase的基本存储单元是Region,每个Region包含一个或多个列族的数据。Region可以跨服务器分布,以达到负载均衡的目的。 - **Store概念**: Store是Region内部的存储单位,每个Store对应一个列族。 ...
10. **split**:手动分裂Region,如`split 'testTable', 'rowkey'`。 以上只是HBase Shell的一些基础操作,实际使用中还会有更多高级功能,如批量操作、过滤器等,这些都需要根据具体场景进行学习和掌握。 在HBase...
`hbase.hregion.memstore.flush.size`决定了每个Region内存缓冲区的刷新阈值,当达到此大小时,Region会触发flush操作,将数据写入磁盘。 `hbase.regionserver.handler.count`是RegionServer处理请求的线程数,增加...
6. **优化策略**:除了自动负载平衡,还可以通过调整HBase的配置参数,如 RegionSplitPolicy、RegionServer负载阈值等,来优化系统的负载平衡效果。此外,定期分析和调整表的分区策略也是必要的。 7. **监控与调优*...