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、读取数据
读取数据的方法有两个:get
和 scan
。
-
get
最大范围是一行数据,也可以进行列的过滤,读取数据的结果为多行cell
。get 'bigdata:student','1001' get 'bigdata:student','1001' , {COLUMN => 'info:name'}
也可以修改读取
cell
的版本数,默认读取一个。最多能够读取当前列族设置的维护版本数。get 'bigdata:student','1001', {COLUMN => 'info:name', VERSIONS => 6}
-
scan
是扫描数据,能够读取多行数据,不建议扫描过多的数据,推荐使用startRow
和stopRow
来控制读取的数据,默认范围左闭右开。scan 'bigdata:student',{STARTROW => '1001',STOPROW => '1002'}
实际开发中使用 shell 的机会不多,所有丰富的使用方法到 API 中介绍。
4.3、删除数据
删除数据的方法有两个:delete
和 deleteall
。
-
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),如果需要运行
HBase
的MR
任务,可以减小此值,因为一个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 的值有优化),如果使用mob
(Medium-sized Objects
一种特殊用法)则不超过 50M。 -
1 张表有 1 到 3 个列族,不要设计太多。最好就 1 个,如果使用多个尽量保证不会同时读取多个列族。
-
1 到 2 个列族的表格,设计 50-100 个
Region
。 -
列族名称要尽量短,不要去模仿
RDBMS
(关系型数据库)具有准确的名称和描述。 -
如果
RowKey
设计时间在最前面,会导致有大量的旧数据存储在不活跃的Region
中,使用的时候,仅仅会操作少数的活动Region
,此时建议增加更多的Region
个数。 -
如果只有一个列族用于写入数据,分配内存资源的时候可以做出调整,即写缓存不会占用太多的内存。