1.hbase的数据库介绍(掌握)
2.hbase的基础架构(掌握)
3.hbase的集群的搭建
4.hbase shell
5.hbase的api开发(重点)
6.hbase的底层原理(重点)
1)hbase的详细架构
2)hbase的数据读写流程
7.rowkey的设计技巧
1.hbase数据库的介绍
hbase:是一个数据库。数据库来源于google的BigTable论文。典型的key/value形式的数据存储,是一个nosql的数据库。是一个列式存储的数据库。是建立在hdfs的基础之上。
hbase只能支持简单的事务处理,只能一列一列的插入数据。
hbase的特点:
1)大:存储大量的数据。
2)无模式:一行中可以有多个不同的列。
3)面向列:数据是按照列式进行存储。
4)稀疏:对于空的列,不会占用存储空间。
5)数据多版本:每个数据单元可以根据version设置进行多版本数据的存储。
6)数据类型单一:hbase中的数据类型是单一的,是byte[]
hbase的表结构:
1)rowkey:行键,作为主键进行查询
数据查询的三种方式:
1)通过rowkey查询一条数据:
2)通过rowkey的范围查找数据:startrowkey endrowkey
3)全表扫描:
rowkey是按照字典的顺序排序。
2)列族:表示多个列的一个聚合,创建表的时候一定要定义(schema)
一般建议一张表最多有个3个列族即可。
3)列:指列族下的某一个列,是数据存储的一个位置。
4)时间戳: 数据的存储和修改的时间。
5)版本:表示一个列族下的数据的不同版本。
6)cell(单元格)由{row key, column(= + ), version} 唯一确定的单元。
2.habse的架构
1)client:主要用于提交或者读取数据,首先访问zookeeper,通过返回的信息找到管理的regionserver进行数据的操作。
2)HMaster:
1)管理HRegionserver的负载均衡。
2)为regionserver分配region。
3)负责失效的HRegionserver,并重新分配其管理的region给其他的server。
3)HRegionserver:
1)用于负责管理region,一个server可以管理不同表的多个region。
2)负责切分(split)过大的region
3)负责小的hfile的合并
4) region:分布式存储的最小单元,存储的是张表的部分或全部数据。
5)zookeeper:
1)管理hmaster的HA。
2)Hregionserver要向zookeeper进行状态的注册。
3)负责监控Hregionserver的状态信息,监控服务的上线和下线。
4)注册metaregionserver的元数据管理节点
3.hbase部署
详见文档
4.hbase shell
COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve
Group name: tools
Commands: assign, balance_switch, balancer, balancer_enabled, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, close_region, compact, compact_mob, compact_rs, flush, major_compact, major_compact_mob, merge_region, move, normalize, normalizer_enabled, normalizer_switch, split, trace, unassign, wal_roll, zk_dump
Group name: replication
Commands: add_peer, append_peer_tableCFs, disable_peer, disable_table_replication, enable_peer, enable_table_replication, get_peer_config, list_peer_configs, list_peers, list_replicated_tables, remove_peer, remove_peer_tableCFs, set_peer_tableCFs, show_peer_tableCFs, update_peer_config
Group name: snapshots
Commands: clone_snapshot, delete_all_snapshot, delete_snapshot, list_snapshots, restore_snapshot, snapshot
Group name: configuration
Commands: update_all_config, update_config
Group name: quotas
Commands: list_quotas, set_quota
Group name: security
Commands: grant, list_security_capabilities, revoke, user_permission
Group name: procedures
Commands: abort_procedure, list_procedures
Group name: visibility labels
Commands: add_labels, clear_auths, get_auths, list_labels, set_auths, set_visibility
Group name: rsgroup
Commands: add_rsgroup, balance_rsgroup, get_rsgroup, get_server_rsgroup, get_table_rsgroup, list_rsgroups, move_servers_rsgroup, move_tables_rsgroup, remove_rsgroup
1)help 查看命令信息
2)list 列出用户表
3)创建一张user表,包含info 和data列族
create ’user‘,’info‘,’data‘
或者
create 'user', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}
4)添加数据 put
put 'user', 'rk0001', 'info:name', 'zhangsan'
5)查询数据 get 只能获取一条数据
get ’user‘,’rk0001‘
查看指定列族的数据
get ’user‘,’rk0001‘,’info‘
查看rowkey指定列族指定字段的值
get ’user‘,’rk0001‘,’info:name‘
6)指定rowkey与列值查询
get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}
7)指定rowkey与列值的模糊查询
get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
8)查询所有数据
scan 'user'
9)列族查询
scan ’user‘,{COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
10)多列族查询
scan 'user', {COLUMNS => ['info', 'data']}
11)指定列族与某个列名查询
scan 'user', {COLUMNS => 'info:name'}
12)指定列族与列名以及限定版本查询
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
13)指定多个列族与按照数据值模糊查询
scan 'user', {COLUMNS => ['info', 'data'], FILTER =>"(QualifierFilter(=,'substring:a'))"}
14)rowkey的范围值查询
scan 'user', {COLUMNS => 'info', STARTROW=> 'rk0001', ENDROW => 'rk0003'}
注意:查询范围是左包又不包
15)指定rowkey模糊查询 --rowkey的前缀过滤器(专用过滤器)
scan 'user',{FILTER=>"PrefixFilter('rk')"}
删除数据
delete 'user', 'rk0001', 'info:name'
删除列族
alter 'user', NAME => 'info', METHOD => 'delete'
清空表数据
truncate 'user1'
删除表
disable 'user'
drop 'user'
8.rowkey的设计技巧
1)rowkey的长度原则:默认最大可以存储64k长度的数据。
rowkey越短越好,最好不要超过16个字节。
2)rowkey的散列原则:将rowkey打散,分散在不同region中进行管理。(热点)
3)rowkey的唯一原则:一行数据rowkey一定是唯一的。
解决热点问题的方法:
1)加盐:在rowkey前面加上一个随机数,rowkey会散列的分散在不同的分区中。
2)哈希:保证单列的原则。
3)反转:将rowkey前后反转,保证数据的散列。
4)时间戳反转