1.关闭自动的split
大 Region 意味着较大的 StoreFile,compaction 时对内存也是一个挑战。如果你的应用场景中,某个时间点的访问量较低,那么在此时做 compact 和 split,既能顺利完成 split 和 compaction,又能保证绝大多数时间平稳的读写性能。compaction 是无法避免的,split 可以从自动调整为手动。只要通过将这个参数值调大到某个很难达到的值,比如 100G,就可以间接禁用自动 split(RegionServer 不会对未到达 100G 的 Region 做 split)。再配合 RegionSplitter 这个工具,在需要 split 时,手动 split。手动 split 在灵活性和稳定性上比起自动 split 要高很多,而且管理成本增加不多
2.Scan的时候设置cache
- 在HBase的conf配置文件中进行配置 hbase.client.scanner.caching
- 通过调用 HTble.setScannerCaching(int scannerCaching) 进行配置;
- 通过调用 Sacn.setCaching(int caching) 进行配置,三者的优先级越来越高。
3.缓存策略(setCaching);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
if (admin.tableExists(tableName)) {
logger.info("table {} is exists", tableName);
return;
}
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(tableName));
for (String str : cfs) {
HColumnDescriptor columnDescriptor = new HColumnDescriptor(str);
// columnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);
//中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置 setMaxVersions(1)
columnDescriptor.setMaxVersions(1);
//创建表的时候,可以通过 HColumnDEscriptor.setInMemory(true) 将表放到RegionServer的缓存中,保证在读取的时候被cache命中。
columnDescriptor.setInMemory(true);
columnDescriptor.setTimeToLive(-1);
descriptor.addFamily(columnDescriptor);
}
admin.createTable(descriptor, splitKey);
4.Hbase split
在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的。一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个regionServer中。
在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的。一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个regionServer中。在自动split策略中,当一个region达到一定的大小就会自动split成两个region。table在region中是按照row key来排序的,并且一个row key所对应的行只会存储在一个region中,这一点保证了Hbase的强一致性 。
在一个region中有一个或多个stroe,每个stroe对应一个column families(列族)。一个store中包含一个memstore 和 0 或 多个store files。每个column family 是分开存放和分开访问的。
5.Hbase Delete过程
Hbase的删除并不像传统关系型数据库的删除,hbase删除动作并不会立刻将HBase存储的数据进行删除,而是心在制定的KeyValue存储单元上打上删除标志。等到下一次region合并、分裂等操作时才会将所有的数据进行移除。
在进行删除会。可以通过指定对某一行的某一个列簇、或者某一个列、或者某一个列中具体版本的数据进行删除。
如果在没有任何设定的情况下,则会删除整行数据。如果使用 addFamily 函数,则会删除改行中的指定列簇中的所有数据。
6.HBase Compaction
HBase是一种Log-Structured Merge Tree架构模式,用户数据写入先写WAL,再写缓存,满足一定条件后缓存数据会执行flush操作真正落盘,形成一个数据文件HFile。随着数据写入不断增多,flush次数也会不断增多,进而HFile数据文件就会越来越多。然而,太多数据文件会导致数据查询IO次数增多,因此HBase尝试着不断对这些文件进行合并,这个合并过程称为Compaction。
Compaction会从一个region的一个store中选择一些hfile文件进行合并。合并说来原理很简单,先从这些待合并的数据文件中读出KeyValues,再按照由小到大排列后写入一个新的文件中。之后,这个新生成的文件就会取代之前待合并的所有文件对外提供服务。HBase根据合并规模将Compaction分为了两类:MinorCompaction和MajorCompaction