1.RowKey设计
2.参数优化
2.1 zk会话超时时间
hbase-site.xml zookeeper.session.timeout: 默认值90000毫秒(90s)。 当某个RegionServer挂掉后,90s之后Master才能察觉到。可适当减少此值,尽可能块的检测regionServer故障,可调整值20-30s。
也可以调整中间等待多少秒后重试,以及重试次数。 hbase.client.pause(默认值100ms) 等待多少秒 hbase.client.retries.number(默认15次) 重试次数
2.2 设置RPC监听数量
hbase.regionserver.handler.count: 默认值30 用于指定RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。 这里指put或者get操作特别多时,可以增加该值。
2.3 手工设置Major Compaction(大合并)
hbase.hregion.majorcompaction: 默认值604800000 秒,(7天) Major Compaction的周期,若关闭自动大合并,可将其设置为0,但是一定要记得手工合并,因为大合并可以将所有冗余的数据删除掉。
手工大合并的代码如下:
def majorCompact(): Unit = {
val writer = new PrintWriter(new FileWriter(new File("/home/hadoop/logs/majorCompact.log"), true))
val admin = connection.getAdmin
val tableNames = admin.listTableNames()
tableNames.foreach {
tableName =>
admin.majorCompact(tableName)
Thread.sleep(10 * 1000)
writer.println(DateUtil.getNowTimestamp + " major compact " + tableName.getNameAsString)
writer.flush()
}
admin.close()
connection.close()
}
2.4 优化HStore文件大小
hbase.hregion.max.filesize: 默认值10737418240 (10GB),官方推荐10G-50G都是可以的。 如果需要运行Hbase的MR任务,可以减小此值,因为一个region对应一个map任务。 如果单个region过大,会导致map任务执行时间过长。该值的意思就是,如果Hfile的大小达到这个数值,则这个region会被切分为两个Hfile。 (Hfile文件和HStore文件是指同一个东西)
2.5 优化客户端缓存
hbase.client.write.buffer: 默认值2097152bytes(2M) 用于指定Hbase客户端缓存,增大该值可以减少RPC调用次数,但是会消耗更多内存。一般我们需要设定一定的缓存大小,以达到减少RPC次数的目的。 这里指网络通信的缓存。
2.6 指定scan.next扫描hbase表所获取的行数
hbase.client.scanner.caching: 默认值是Integer.MAX_VALUE,即2的31次方-1,这个时候就以hbase.client.scanner.max.result.size为准。 配置的是一个int类型的值,表示一次RPC请求从Region Server端获取的数据行数。 为什么叫做caching呢?由于每次next()是获取一行数据,但是一次RPC调用是多行,实际是先缓存在内存中,当某次next()发现缓存中没有数据时才会发起RPC调用。 这个参数和hbase.client.scanner.max.result.size配合使用,可以使网络使用更有效率。
hbase.client.scanner.max.result.size:默认配置是2MB。 一次RPC调用返回的最大字节数。注意当表的一行数据大小大于这个限制,仍然完整返回完整的数据行。对于更快或者高延迟的网络,这个值应该增加。
2.7 BlockCache占用RegionServer堆内存的比例
hfile.block.cache.size: 默认0.4 读请求比较多的时候,可适当调大,通常不需要更改。
2.8 MemStore占用RegionServer堆内存的比例
hbase.regionserver.global.memstore.size: 默认0.4 写请求较多的时候,可适当调大,通常不需要修改。
hfile.block.cache.size和hbase.regionserver.global.memstore.size加起来不能超过0.8,即不能超过regionserver堆内存大小的80%
3.JVM调优
主要指内存设置和垃圾回收设置。 垃圾回收修改为并发垃圾回收,默认PO+PS是并行垃圾回收,会有大量的暂停时间。理由是Hbase大量使用内存用于存储数据,容易遭遇数据洪峰造成OOM, 同时写缓存的数据是不能垃圾回收的,主要回收的就是读缓存,而读缓存垃圾回收不影响性能。 所以最终设置的效果可以归纳为:防患于未然,早洗早轻松。
3.1 设置使用CMS收集器
-XX:+UseConcMarkSweepGC
3.2 保持新生代尽量小,同时尽早开启GC
# 在内存占用到70%的时候开启GC
-XX:CMSInitiatingOccupancyFraction=70
#指定使用70%,不让JVM动态调整
-XX:+UseCMSInitiatingOccupancyOnly
#新生代内存设置为512m
-Xmn512m
#并行执行新生代垃圾回收
-XX:+UseParNewGC
4.经验
(1)Region的大小控制在10-50G (2)cell大小不超过10m,如果使用mob,不超过50m (3)1张表有1到3个列簇,不要设计太多。最好就1个,如果设置多个,尽量在读取的时候不要同时读取多个。 (4)1到2个列簇的表格,设置50-100个region (5)列簇名称要尽量短 (6)rowkey设计时,尽量保证数据插入均匀 (7)如果只有一个列簇用于写入数据,分配内存资源的时候可以做出调整,即写缓存不会占用太多的内存。
|