1. 进入 hbase shell 命令行
./hbase shell
  • 1.
  1. 查看帮助
#查看帮助,会列出 命令组
help

#有哪些命令组,常见的CRUD命令在 ddl 和 dml下面
COMMAND GROUPS:
  Group name: general
  
  Group name: ddl
  
  Group name: namespace
  
  Group name: dml
  
  Group name: tools

  Group name: replication

  Group name: snapshots

  Group name: configuration

  Group name: quotas

  Group name: security

  Group name: procedures

  Group name: visibility labels

  Group name: rsgroup

  Group name: storefiletracker
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  1. hbase shell 里面 字符串可以用 '' 或者 ""表示
  2. hbase的参数格式
命令 参数1,参数2,参数3,...格式
命令 参数1,参数2,{属性1=>值,属性2=>值},...格式

如果参数是多个属性的{属性1=>值,属性2=>值}表示,所有属性都需要大写,属性不能用""包裹
  • 1.
  • 2.
  • 3.
  • 4.
  1. 命名空间操作(类似数据库)
  • help "namespace" #查看命名空间相关命令用法
  • list_namespace #查看有哪些命名空间
  • create_namespace 命名空间名字 #创建命名空间
  • drop_namespace 命名空间名字 #删除命名空间
  1. 表的操作
  • help "ddl" #查看ddl相关命名
  • hbase有两个自带命名空间 hbase 和 default
    如果是default命名空间的表可以省略命名空间
  • alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5} #修改表定义
alter "goods",{NAME=>"f1:name",VERSIONS=>3}
  • 1.
  • create "命名空间.表名","列族1","列族2" #创建一个表,有两个列族(简写)
  • create "t1", {NAME => "f1", VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
    创建一个表t1,创建列族f1,这个列族保留1个版本
  • disable "ns1:t1" #禁用一个表
  • enable "ns1:t1" #启用一个表
  • drop "ns1:t1" #删除一个表(删除前必须要禁用)
  • desc "ns1:t1" #查看表的结构
  • truncate "ns1:t1" #清空一个表的数据
  • exists "ns1.t1" #表是否存在
  • list "goo.*" #查看指定看开头的表
  1. 表数据的操作
  • help "dml" #查看dml相关命名
  • put "表名","rowId","列族:列名","0003name" #添加数据(一次添加一个cell,一行数据需要多次添加)
    put 可以添加也可以修改,修改实际就是添加一个新版本的数据
  • get "表名","rowId" #查询指定行记录
  • get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']} #查询的时候只查询只指定列族
  • scan "goods",{STARTROW=>"开始ID",ENDROW=>"结束ID"} #扫描一个表(分页查询)
  • scan "goods",{STARTROW=>"开始ID",LIMIT=>每页多少条} #分页查询
  • scan "goods" #查询全部
  • count "表名" #查看有多少条记录
  • deleteall "表名", "rowId" #删除一条记录
  • deleteall "表名", "rowId" ,"f1" #删除一个列族里面的数据
  • incr "表名","rowId","列族:列名" #指定列自增(需要long类型才可以)
  • incr "表名","rowId","列族:列名" ,10 #指定列自增10
  1. 列族属性
  • NAME #列族名字
  • VERSIONS #保留几个版本
    默认0
  • MIN_VERSIONS # 最小版本数
  • IN_MEMORY # 激进缓存
  • BLOOMFILTER # 布隆过滤器
  • TTL #保存时间(s)
    默认永久
  • BLOCKCACHE #是否启用块缓存
  • BLOCKSIZE # 数据块大小
    默认64K
  • DATA_BLOCK_ENCODING # 数据块编码
  • CONFIGURATION #
  • COMPRESSION # 压缩方式
  • NUMREGIONS #region的数量
  • SPLITS_FILE #使用指定文件拆分region
实际是更具 rowkey 的字段顺序拆分的,所以rowkey的前面几个字符的设计应该考虑分区


#比如文件是这样
1
2
3

表示
rowkey小于1的一个区,
1-2的一个区
2-3的一个区
3以上的一个区

这里的区间是字段排序的区间不是数字的区间
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • REGION_REPLICATION #region的副本数
  • SPLITS #指定分区
SPLITS => [‘1000’,‘2000’,‘3000’,‘4000’]
  • 1.
  • SPLITALGO #按照16进制分区
SPLITALGO=>'HexStringSplit'
  • 1.
  • OWNER #所属人
  1. 查看历史版本
  • hbase里面的数据实际是不能修改的,修改实际是新增数据,并且保留指定version数量个版本.
    超过version数量的版本会在合并数据的时候被删除.
  • 指定保存多少个版本是在列族上指定的
#goods表,的f1列族,保留5个最新版本
alter 'goods', {NAME => 'f1', VERSIONS => 5}
  • 1.
  • 2.
  • 所以查询历史版本也是要指定到列族,不指定版本都是指显示最新的一个版本(时间最大的版本)
#查看goods表,rowKey="0003"的记录,里面列族是f1,列是name的cell,并且查看最新的两个版本
get "goods","0003",{COLUMN=>"f1:name",VERSIONS=>2}
  • 1.
  • 2.
  1. delete 和 deleteall 的区别
  • deleteall 删除的全部版本数据,
    deleteall 可以删除整行数据,也可以删除指定列族或者列的数据
  • delete 删除最新的版本
    版本是定义在列族上面的,所以不能删除行,只能删除列数据,并且删除列族也无效
#删除的是 0003这列,里面 f1:name 最新的一个版本的数据
delete "goods","0003","f1:name
  • 1.
  • 2.
  1. rowkey的设计建议
  2. hbase的一些控制参数
  • 设置合理的zookeeper回话超时时间
    hbase-site.xml
#默认90秒,也就是90秒才能感知节点regionServer失联,如果网络好可以调低
zookeeper.session.timeout

#从连间隔和重试次数
hbase.client.pasuse
hbase.client.retrise.nunber
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 设置合理的regionServer连接数
    hbase-site.xml
#regionServer的连接数,默认30
hbase.regionserver.handler.count
  • 1.
  • 2.
  • 设置大合并的时间
    hbase-site.xml
#大合并默认时间7天
hbase.hregion.majorcompaction
  • 1.
  • 2.
  • 设置合适的Hstore文件大小
    hbase-site.xml
#最大的文件大小,超过就会拆分成不同的region,默认10GB
hbase.hregion.max.filesize
  • 1.
  • 2.
  • 客户端缓存大小,缓存可以提高写效率
    hbase-site.xml
#客户端写数据在内存缓存多大就会触发落盘,默认2MB,还有一个时间参数可以控制落盘行为,
hbase.client.write.buffer
  • 1.
  • 2.
  • scan.next所获取的行数限制
    hbase-site.xml
#指定scan.next方法获取的默认行数,值越大消耗内存越大,默认是Integer.max
hbase.client.scanner.caching
  • 1.
  • 2.
  • 读写缓存比例(读写内存和建议不要超
  • 过超过80%)
    hbase-site.xml
#blockCache占RegionServer堆内存的比例,读多可以调大,默认0.4
hfile.block.cache.size

#memstore占regionserver的比例,写多可以调大,默认0.4
hbase.regionserver.global.memstore.size
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • hbase 和jvm有直接关系,hbase regionServer一般有80%的内存是个读写缓存的,剩下的20%是程序自己用jvm可以更具这方面优化,比如使用并行回收减少STW的时间,因为写缓存很多时间都在积累数据,所以回收效率比较低(刷写数据以后才能回收),读缓存和程序内存可以回收.
    建议减少新生代的空间,尽早做小GC,而不是等数据量来着做大GC.
  1. 一些建议
  • region 大小控制早10-50G
  • cell的大小不要超过10M,小于100K的值有优化
  • 使用mod(Medium-sized-object)不要超过50M
  • 一张表的列族建议1-3个,不要设计太多列族,最好就一个,多个列族建议存放不需要同时读取的数据
  • 列族名称要短,每个cell列名都会占用空间
  • 如果只有一个列族用于写数据,那么写缓存不会占用太多资源,所以可以把写缓存比例调小