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)如果只有一个列簇用于写入数据,分配内存资源的时候可以做出调整,即写缓存不会占用太多的内存。

原文地址:http://www.cnblogs.com/30go/p/16810257.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性