HBase——一文搞懂HBase的操作以及HBase的优化

1、基本操作

1.1、 进入HBase客户端命令行

bin/hbase shell

1.2、 查看帮助命令

能够展示HBase 中所有能使用的命令,主要使用的命令有 namespace 命令空间相关,DDL 创建修改表格,DML 写入读取数据。

help

2、namespace

2.1、创建命名空间

help 'create_namespace'

2.2、创建命名空间 bigdata

create_namespace 'bigdata'

2.3、查看所有的命名空间

list_namespace

3、DDL

3.1、创建表

bigdata 命名空间中创建表格 student,两个列族。info 列族数据维护的版本数为 5 个,如果不写默认版本数为 1。

create 'bigdata:student', {NAME => 'info', VERSIONS => 5}, {NAME => 'msg'}

如果创建表格只有一个列族,没有列族属性,可以简写。如果不写命名空间,使用默认的命名空间default

create 'student1','info'

3.2、查看表

  • list 查看所有的表名

    list
    
  • describe 查看一个表的详情

    describe 'student1'
    

3.3、修改表

表名创建时写的所有和列族相关的信息,都可以后续通过 alter 修改,包括增加删除列族。

  • 增加列族和修改信息都使用覆盖的方法

    alter 'student1', {NAME => 'f1', VERSIONS => 3}
    
  • 删除信息使用特殊的语法

    alter 'student1', NAME => 'f1', METHOD => 'delete'
    alter 'student1', 'delete' => 'f1'
    

3.4、删除表

shell 中删除表格,需要先将表格状态设置为不可用。

disable 'student1'
drop 'student1'

4、DML

4.1、写入数据

HBase 中如果想要写入数据,只能添加结构中最底层的 cell。可以手动写入时间戳指定 cell 的版本,推荐不写默认使用当前的系统时间。

put 'bigdata:student','1001','info:name','zhangsan'
put 'bigdata:student','1001','info:name','lisi'
put 'bigdata:student','1001','info:age','18'

如果重复写入相同 rowKey,相同列的数据,会写入多个版本进行覆盖

4.2、读取数据

读取数据的方法有两个:getscan

  • get 最大范围是一行数据,也可以进行列的过滤,读取数据的结果为多行 cell

    get 'bigdata:student','1001'
    get 'bigdata:student','1001' , {COLUMN => 'info:name'}
    

    也可以修改读取 cell 的版本数,默认读取一个。最多能够读取当前列族设置的维护版本数。

    get 'bigdata:student','1001', {COLUMN => 'info:name', VERSIONS => 6}
    
  • scan 是扫描数据,能够读取多行数据,不建议扫描过多的数据,推荐使用 startRowstopRow 来控制读取的数据,默认范围左闭右开。

    scan 'bigdata:student',{STARTROW => '1001',STOPROW => '1002'}
    

    实际开发中使用 shell 的机会不多,所有丰富的使用方法到 API 中介绍。

4.3、删除数据

删除数据的方法有两个:deletedeleteall

  • delete 表示删除一个版本的数据,即为 1 个 cell,不填写版本默认删除最新的一个版本。

    delete 'bigdata:student','1001','info:name'
    
  • deleteall 表示删除所有版本的数据,即为当前行当前列的多个 cell。(执行命令会标记数据为要删除,不会直接将数据彻底删除,删除数据只在特定时期清理磁盘时进行)

    deleteall 'bigdata:student','1001','info:name'
    

5、RowKey设计

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个一个预分区的区间内,设计rowkey的主要目的 ,就是让数据均匀的分布于所有的Region中,在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案。

  • 生成随机数、hash 、散列值
  • 时间戳反转
  • 字符串拼接

6、参数优化

都是在hbase-site.xml上进行修改。

6.1、Zookeeper 会话超时时间

  • 属性:zookeeper.session.timeout

  • 解释: 默认值为 90000 毫秒(90s)。当某个 RegionServer挂掉,90s 之后 Master 才能察觉到。可适当减小此值,尽可能快地检测 regionserver 故障,可调整至 20-30s。

    # 看你能有都能忍耐超时,同时可以调整重试时间和重试次数
    hbase.client.pause(默认值 100ms)
    hbase.client.retries.number(默认 15 次)
    

6.2、 设置 RPC 监听数量

  • 属性: hbase.regionserver.handler.count
  • 解释: 默认值为30,用于指定 RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。

6.3、 手动控制 Major Compaction

  • 属性:hbase.hregion.majorcompaction
  • 解释: 默认值:604800000 秒(7 天), Major Compaction 的周期,若关闭自动 Major Compaction,可将其设为 0。如果关闭一定记得自己手动合并,因为大合并非常有意义

6.4、 优化 HStore文件大小

  • 属性:hbase.hregion.max.filesize
  • 解释: 默认值 10737418240(10GB),如果需要运行 HBaseMR 任务,可以减小此值,因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两个 Hfile

6.5、 优化 HBase 客户端缓存

  • 属性:hbase.client.write.buffer
  • 解释: 默认值 2097152bytes(2M)用于指定 HBase 客户端缓存,增大该值可以减少 RPC调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。

6.6、 指定 scan.next扫描 HBase 所获取的行数

  • 属性:hbase.client.scanner.caching
  • 解释: 用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。

6.7、BlockCache 占用 RegionServer 堆内存的比例

  • 属性:hfile.block.cache.size
  • 解释: 默认 0.4,读请求比较多的情况下,可适当调大

6.8、MemStore 占用 RegionServer 堆内存的比例

  • 属性:hbase.regionserver.global.memstore.size
  • 解释: 默认 0.4,写请求较多的情况下,可适当调大

Lars Hofhansl(拉斯·霍夫汉斯)大神推荐 Region** 设置 20G,刷写大小设置 128M**,其
它默认。

7、JVM 调优

JVM 调优的思路有两部分:一是内存设置,二是垃圾回收器设置

垃圾回收的修改是使用并发垃圾回收,默认 PO+PS 是并行垃圾回收,会有大量的暂停。理由是 HBsae 大量使用内存用于存储数据,容易遭遇数据洪峰造成 OOM,同时写缓存的数据是不能垃圾回收的,主要回收的就是读缓存,而读缓存垃圾回收不影响性能,所以最终设置的效果可以总结为:防患于未然,早洗早轻松。

7.1、设置使用 CMS 收集器

-XX:+UseConcMarkSweepGC

7.2、保持新生代尽量小,同时尽早开启 GC

// 在内存占用到 70%的时候开启 GC
-XX:CMSInitiatingOccupancyFraction=70
// 指定使用 70%,不让 JVM 动态调整
-XX:+UseCMSInitiatingOccupancyOnly
// 新生代内存设置为 512m
-Xmn512m 
// 并行执行新生代垃圾回收
-XX:+UseParNewGC
// 设 置 scanner 扫 描 结 果 占 用 内 存 大 小 , 在 hbase-site.xml 中 , 设 置
hbase.client.scanner.max.result.size(默认值为 2M)为 eden 空间的 1/8(大概在 64M)
// 设置多个与 max.result.size * handler.count 相乘的结果小于 Survivor
Space(新生代经过垃圾回收之后存活的对象)

8、HBase 使用经验法则

官方给出了权威的使用法则:

  • Region 大小控制 10-50G

  • cell大小不超过 10M(性能对应小于 100K 的值有优化),如果使用 mobMedium-sized Objects 一种特殊用法)则不超过 50M。

  • 1 张表有 1 到 3 个列族,不要设计太多。最好就 1 个,如果使用多个尽量保证不会同时读取多个列族。

  • 1 到 2 个列族的表格,设计 50-100 个Region

  • 列族名称要尽量短,不要去模仿 RDBMS(关系型数据库)具有准确的名称和描述。

  • 如果 RowKey 设计时间在最前面,会导致有大量的旧数据存储在不活跃的 Region中,使用的时候,仅仅会操作少数的活动 Region,此时建议增加更多的 Region 个数。

  • 如果只有一个列族用于写入数据,分配内存资源的时候可以做出调整,即写缓存不会占用太多的内存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值