登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
HBase读写流程
多租户环境
HBase HA
HBase预分区
RowKey设计
HBase优化
HBase数据删除与Split
HBase PythonAPI
HBase存储结构
HBased对接Hive
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
HBase
>>
HBase预分区
HBase预分区
2020-07-03 23:36:25 星期五 阅读:1839
####预分区的意义 默认情况下,HBase只有一个region,随着数据量越来越多, 会进行region的分裂。但是最开始建表的时候,只有一个region的情况下,所有的请求都落到这一个region的机器上,严重的影响HBase的性能。而每一个 region 维护着 StartRow 与 EndRow,如果加入的数据符合某个 Region 维护的 RowKey 范围,则该数据交给这个 Region 维护。那么依照这个原则,我们`可以将数据所要投放的分区提前大致的规划好`,以提高 HBase 性能。 ####预分区到底分几个区合适? 主要考虑以下两个因素 `数据量`:未来一年到两年的数据量 `机器规模`:生产环境每台机器放2-3个region 预分区后,如果某个分区的数据量达到hbase默认的大小(10GB),还是会自动split。所以,为了避免hbase自动分区带来的性能损耗,一般预分区会根据未来的数据量,保证每个region的数据保持在10GB以下。比如:预估该表在未来1-2年数据量在200GB左右,预分区的时候,分区数应该大于20个才能保证每个region的数据量小于10GB,从而避免hbase自动分区。 ####手动预分区 创建一个表staff1,并且创建两个列族info和partition1,指定4个分区键(5个分区) `hbase> create "staff1", "info", "partition1", SPLITS => ["1001","1002","1003","1004"]` 创建完成后,可在16010端口看到该表的所有region。 分区键的选择跟hbase表RowKey的设计是相辅相成的,分区键的设计也关系到region的热点问题。比如上面的分区键,5、6、7、8、9开头的rowkey数据全部放到最后一个region,这显然是不合理的。 ####生成16进制序列预分区 创建一个表staff2,并且创建两个列族info和partition2,指定分区个数为15,按照16进制序列分区 `hbase> create "staff2", "info", "partition2", {NUMREGIONS=>15, SPLITALGO=>"HexStringSplit"}` 创建完成后,可在16010端口看到该表的所有region ####根据文件中设置的规则预分区 随便创建一个splits.txt文件 0ac b78 9f2 c56 ff8 执行hbase创建表命令,并指定预分区规则文件 `hbase > create "staff3", "partition3", SPLITS_FILE => "/tmp/splits.txt"` 创建完成后,可在16010端口看到该表的所有region ####通过HBase API创建预分区 ```java //自定义算法,产生一系列 hash 散列值存储在二维数组中 byte[][] splitKeys = 某个散列值函数 //创建 HbaseAdmin 实例 HBaseAdmin hAdmin = new HBaseAdmin(HbaseConfiguration.create()); //创建 HTableDescriptor 实例 HTableDescriptor tableDesc = new HTableDescriptor(tableName); //通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的Hbase表 hAdmin.createTable(tableDesc, splitKeys); ```