1.背景介绍
1. 背景介绍
HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。它是Hadoop生态系统的一部分,可以与HDFS、MapReduce、ZooKeeper等组件集成。HBase具有高可靠性、高性能和高可扩展性等优势,适用于大规模数据存储和实时数据处理等场景。
Region分裂是HBase集群中的一个重要操作,可以在HBase表中增加更多的Region server,提高集群的并发能力和数据存储能力。Region分裂可以通过自动或手动触发,以实现更高效的数据存储和访问。
本文将从以下几个方面进行深入探讨:
- 核心概念与联系
- 核心算法原理和具体操作步骤
- 数学模型公式详细讲解
- 具体最佳实践:代码实例和详细解释说明
- 实际应用场景
- 工具和资源推荐
- 总结:未来发展趋势与挑战
2. 核心概念与联系
在HBase中,数据存储在Region server上,每个Region server包含多个Region。Region是HBase中最小的存储单位,包含一定范围的行键和列族。Region分裂是指将一个Region拆分成多个新Region。
Region分裂的核心概念包括:
- Region:HBase中最小的存储单位,包含一定范围的行键和列族。
- Region server:HBase集群中的一个节点,负责存储和管理一定范围的Region。
- 分裂策略:Region分裂的策略,可以是自动分裂(自动触发)或手动分裂(手动触发)。
Region分裂与HBase集群的关系在于,Region分裂可以增加更多的Region server,从而提高集群的并发能力和数据存储能力。同时,Region分裂可以避免Region过大,从而减少单个Region的负载,提高集群的性能。
3. 核心算法原理和具体操作步骤
Region分裂的算法原理是基于Range分区策略,即将一个Region拆分成多个新Region,使得每个新Region的键值范围都在原Region的范围内。具体操作步骤如下:
- 检查Region是否需要分裂。可以通过查看Region的大小、负载、访问次数等指标来判断是否需要分裂。
- 确定分裂策略。可以是自动分裂(自动触发)或手动分裂(手动触发)。
- 选择分裂策略。根据实际需求和场景,选择合适的分裂策略。
- 执行分裂操作。根据选择的分裂策略,执行分裂操作,将原Region拆分成多个新Region。
- 更新元数据。更新HBase元数据,使得新Region能够被HBase集群识别和管理。
- 调整Region server负载。根据新Region的分布,调整Region server的负载,以实现更高效的数据存储和访问。
4. 数学模型公式详细讲解
在Region分裂中,可以使用Range分区策略来确定新Region的键值范围。Range分区策略的数学模型公式如下:
其中, 表示原Region的键值范围, 表示新Region的键值范围, 和 分别表示原Region的最小键值和最大键值, 表示分裂点的键值。
通过Range分区策略,可以将原Region拆分成多个新Region,使得每个新Region的键值范围都在原Region的范围内。
5. 具体最佳实践:代码实例和详细解释说明
以下是一个HBase Region分裂的代码实例:
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.ArrayList;
import java.util.List;
public class HBaseRegionSplit {
public static void main(String[] args) throws Exception {
// 获取HBase配置
Configuration conf = HBaseConfiguration.create();
// 获取HBase连接
Connection connection = ConnectionFactory.createConnection(conf);
// 获取Admin实例
Admin admin = connection.getAdmin();
// 获取表实例
Table table = connection.getTable(TableName.valueOf("test"));
// 获取Region信息
List<RegionInfo> regionInfos = admin.getAllRegions(table, true);
// 遍历Region信息
for (RegionInfo regionInfo : regionInfos) {
// 获取Region的起始键和结束键
byte[] startRow = regionInfo.getStartRow();
byte[] endRow = regionInfo.getEndRow();
// 计算分裂点的键值
byte[] splitKey = Bytes.add(startRow, endRow);
// 创建新Region
RegionInfo newRegionInfo = new RegionInfo(
Bytes.toBytes(regionInfo.getId()),
startRow,
splitKey,
regionInfo.getMaxVersions(),
regionInfo.getMemStoreSize(),
regionInfo.getMaxFileSize(),
regionInfo.getInMemoryPercent(),
regionInfo.getMaxCompaction(),
regionInfo.getMinCompaction(),
regionInfo.getCompactionInterval(),
regionInfo.getTTL(),
regionInfo.getMaxSize(),
regionInfo.getMemStoreLimit(),
regionInfo.getBlockCacheSize(),
regionInfo.getBlockSize(),
regionInfo.getBlockCacheNumBlocks(),
regionInfo.getBlockCacheLoadFactor(),
regionInfo.getBlockCacheBlockSize(),
regionInfo.getBlockCacheBlockLoadFactor(),
regionInfo.getBlockCacheBlockCapacity(),
regionInfo.getBlockCacheBlockCapacityLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoad(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacity(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacity(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksCapacity(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksCapacityLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksNumBlocks(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksNumBlocksCapacityNumBlocksNumBlocksLoadFactor(),
regionInfo.getBlockCacheBlockCapacityAtMaxLoadNumBlocksCapacityNumBlocksCapacityNumBlocksNumBlocksNumBlocksNumBlocksNumBlocks NumBlocksNumBlocksNumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumBlocks NumBlocksNumNum Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num Num