HBase
1、防止HBase Region分裂,对HBase预分区的计算公式如下:
需要Region的总数量 = 每天数据量 * 数据保留时间 / 单个Region数据容量
每个HRegion中Region的数量 = 需要Region的总数量 / HDFS集群服务器数量
每台HRegion需要占用的内存容量:每台HRegion中的Region数量 * 表中ColumnFamily的数量 * hbase.hregion.memstore.flush.size / hbase.regionserver.global.memstore.size
2、相关参数列表
序号 | 参数名称 | 参数值 | 备注 |
---|---|---|---|
1 | 每天数据量 | 3T | 预估的,实际情况可能有差异 |
2 | 数据保留时间 | 90天 | 暂定保留90天,可以根据实际情况调整 |
3 | 单个Region数据容量 | 50G | 暂定50G,后期有必要再调整 |
4 | HDFS集群服务器数量 | 17 | 国家中心和分中心目前计划HDFS集群都是17台服务器 |
5 | 每台服务器磁盘容量 | 48T | 固定的,不能变 |
6 | 每台服务器内容容量 | 256G | 固定的,不能变 |
7 | 服务器总的磁盘容量 | 48*17=816T | 每台服务器内容容量 * HDFS集群服务器数量 |
8 | 服务器总的内存容量 | 256*17=4352G | 每台服务器内容容量 * HDFS集群服务器数量 |
9 | 数据副本数量 | 2 | 暂定两副本 |
10 | 每个HRegion中Region的数量 | 350 | 暂定的 |
11 | TTL值 | 7776000s | 90 * 86400s |
12 | HBase中表的Column Family数量 | 1 | HBase中只有一个表,表中只有一个Column Family |
13 | hbase.hregion.memstore.flush.size | 128M | 单个memstore内存的大小 |
14 | hbase.regionserver.global.memstore.size | 0.45 | 写缓存占用总的Hregionserver堆内存的百分比 |
15 | hbase.regionserver.region.split.policy | DisabledRegionSplitPolicy | 禁止Region自动分裂 |
16 | 每个HRegion中Region的数量 | 350 | 参考上面的计算方式 |
17 | Region的总数量 | 5950 | 参考上面的计算方式 |
18 | 每台HRegion需要占用的内存容量 | 120G | 参考上面的计算方式 |
19 | HMaster内存大小 | 16G | 暂定 |
3、调整方案
当实际情况的数据量大于3T/天的解决方案:
1)、单台Region数据容量不变,增加Region数量,如果增加以后导致每台服务器需要的内存过大或者每台服务器上的Region数量大于400,则建议增加服务器数量
2)、Region数量不变,增加单台Region数据容量,不建议超过100G
当实际情况的数据量小于3T/天的解决方案:
1)、单台Region数据容量不变,减少Region数量。官方推荐单台HRegion中Region的数据量保持在20-200个
2)、Region数量不变,减少单台Region数据容量,不建议低于10G
4、现场参数调整
序号 | 参数名称 | 默认值 | 调整前的值 | 调整后的值 | 说明 |
---|---|---|---|---|---|
序号 | 参数名称 | 默认值 | 调整前的值 | 调整后的值 | 说明 |
1 | Xms | 128G | 80G | 写缓存只需要50G,读缓存使用堆外缓存,所以不需要太大的堆内存 | |
2 | Xms | 128G | 80G | 写缓存只需要50G,读缓存使用堆外缓存,所以不需要太大的堆内存 | |
3 | MaxDirectMemorySize | 12G | 40G | 增大堆外内存,使用堆外内存作为读缓存 | |
4 | NewRatio | 4 | 4 | 39 | 限制JVM年轻代大小,年轻代过大会导致GC频率降低,每次GC时间过长 |
5 | SurvivorRatio | 8 | 8 | 2 | 增加年轻代s0区和s1区大小,防止每次GC复制区过小导致对象提早进入老年代 |
6 | hbase.bucketcache.bucket.sizes | 5120,9216,17408, 33792,41984,50176, 58368,66560,99328, 132096,197632263168,394240,525312 | 5120,9216,17408, 33792,41984,50176, 58368,66560,99328, 132096,197632263168,394240,525312 | 5120,9216,17408,33792,41984, 50176,58368,66560,99328,132096, 197632,263168,394240,525312, 787456,1049600 | 增加两种Size的Block两种缓存,即768字节和1M大小的Block的缓存。因为线上小于1M的文件都存储在HBase中,所以有大量的大于512字节和小于1M字节的文件存储在HBase中。 |
7 | hfile.block.cache.size | 0.4 | 0.3 | 015 | 由于读缓存使用堆外缓存存储数据,堆内读缓存只存储数据的Meta,所以降低堆内读缓存 |
8 | hbase.regionserver.global.memstore.size | 0.4 | 0.45 | 0.6 | 由于整个堆内缓存调小了,但是需要的写缓存不变,所以增加写缓存的比例。 |
9 | hbase.ui.blockcache.by.file.max | 100000 | 100000 | 200000 | 读缓存最多缓存的Block数量,读缓存增大了,自然也把Block的限制调高。 |
10 | hbase.bucketcache.size | 0 | 4096 | 36864 | 读缓存大小。使用堆外内存作为读缓存,必须小于MaxDirectMemorySize指定的内存大小 |
11 | hbase.regionserver.optionalcacheflushinterval | 360000 | 360000 | 3600000 | 调大Flush周期,避免Flush太频繁,造成过多小文件。 |
12 | hbase.hstore.compactionThreshold | 3 | 3 | 6 | 触发Minor Compaction需要最小的文件数。 |
13 | hbase.hstore.compaction.max | 10 | 10 | 15 | 参与Minor Compaction最多的文件数 |
14 | hbase.regionserver.thread.compaction.small | 1 | 1 | 3 | 执行Minor Compaction的线程池大小 |
15 | hbase.regionserver.thread.compaction.large | 1 | 1 | 3 | 执行Major Compaction的线程池大小 |
16 | hbase.regionserver.hlog.splitlog.writer.threads | 3 | 3 | 5 | Hlog分割时使用的线程数 |
17 | hbase.regionserver.handler.count | 30 | 30 | 200 | 处理客户端RPC请求的线程数 |
18 | hbase.regionserver.maxlogs | 32 | 32 | 800 | Wal文件大小的最大值,达到最大值以后会触发整个RegionServer 的Memstore Flush |
19 | hbase.hstore.blockingStoreFiles | 10 | 10 | 30 | 某个Store的Hfile数量超过了这个参数的限制 会阻塞该Store写入hbase.hstore.blockingWaitTime 指定的时间 |
对应Ambari中的具体配置项目:
与组件check项搭配使⽤
默认1:5,为0.2
1:40 为0.025,⽼年代为39