HBase
https://www.csdn.net/gather_2e/MtTaEg0sMzE3Ni1ibG9n.html
- 来源:
- 应用:
- 行业:
- Hbase定义:
- Hbase特性:
- Hbase shell
- namespace
- DDL
- DML
- Hbase Java Api
- 依赖
- HbaseUtils
- HbaseDemo
- Hbase过滤器
- Hbase原理
- 架构
- Hbase读写流程
- 写数据流程
- Hbase的存储机制
- 存储模型
- 布隆过滤器
- 2.6.10 Hbase的寻址机制
- 读数据流程
- StoreFile合并
- Region分割
- Hbase2Hdfs
- Hdfs2Hbase
Hbase
来源:
- 解决随机近实时的高效的读写
- 解决非结构化的数据存储
应用:
-
可以存储非结构化的数据(用户、商品、文章的画像属性)
-
被用来做实时(整合flume、storm、streaming等)
-
存储历史明细数据(较少)
-
存储结果数据(数仓,Kylin预执行数据就是放到Hbase中)
行业:
- 通信、银行、金融等
Hbase定义:
- Hadoop的数据库
- Hadoop的分布式、开源的、多版本的非关系型数据库
- Hbase存储Key-Value格式,面向列存储,Hbase底层为字节数据,没有数据类型一说
Hbase特性:
- 线性和模块化可扩展性
- 严格一致的读写
- 表的自动和可配置分片
- RegionServer之间的自动故障转移支持
- 方便的基类,用于通过Apache HBase表备份Hadoop MapReduce作业
- 易于使用的Java API用于客户端访问
- 块缓存和布隆过滤器用于实时查询
- 通过服务器端过滤器查询谓词下推
- Thrift网关和支持XML,Protobuf和二进制数据编码选项的REST-ful Web服务
- 可扩展的基于Jruby的(JIRB)外壳
- 支持通过Hadoop指标子系统将指标导出到文件或Ganglia;或通过JMX
Hbase shell
namespace
1. list_namespace:查询所有命名空间
hbase(main):001:0> list_namespace
NAMESPACE
default
hbase
2. list_namespace_tables : 查询指定命名空间的表
hbase(main):014:0> list_namespace_tables 'hbase'
TABLE
meta
namespace
3. create_namespace : 创建指定的命名空间
hbase(main):018:0> create_namespace 'myns'
hbase(main):019:0> list_namespace
NAMESPACE
default
hbase
myns
4. describe_namespace : 查询指定命名空间的结构
hbase(main):021:0> describe_namespace 'myns'
DESCRIPTION
{NAME => 'myns'}
5. alter_namespace :修改命名空间的结构
hbase(main):022:0> alter_namespace 'myns', {METHOD => 'set', 'name' => 'eRRRchou'}
hbase(main):023:0> describe_namespace 'myns'
DESCRIPTION
{NAME => 'myns', name => 'eRRRchou'}
修改命名空间的结构=>删除name
hbase(main):022:0> alter_namespace 'myns', {METHOD => 'unset', NAME => 'name'}
hbase(main):023:0> describe_namespace 'myns'
6. 删除命名空间
hbase(main):026:0> drop_namespace 'myns'
hbase(main):027:0> list_namespace
NAMESPACE
default
hbase
7. 利用新添加的命名空间建表
hbase(main):032:0> create 'myns:t1', 'f1', 'f2'
DDL
1. 查询所有表
hbase(main):002:0> list
TABLE
HelloHbase
kylin_metadata
myns:t1
3 row(s) in 0.0140 seconds
=> ["HelloHbase", "kylin_metadata", "myns:t1"]
2. describe : 查询表结构
hbase(main):003:0> describe 'myns:t1'
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMP
RESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
{NAME => 'f2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMP
RESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
3. 创建分片表
hbase(main):007:0> create 'myns:t2', 'f1', SPLITS => ['10', '20', '30', '40']
4. 修改表,添加修改列簇信息
hbase(main):009:0> alter 'myns:t1', {NAME=>'info1'}
hbase(main):010:0> describe 'myns:t1'
5. 删除列簇
hbase(main):014:0> alter 'myns:t1', {'delete' => 'info1'}
hbase(main):015:0> describe 'myns:t1'
6. 删除表
hbase(main):016:0> disable 'myns:t1'
hbase(main):017:0> drop 'myns:t1'
DML
用到的表创建语句:
hbase(main):011:0> create 'myns:user_info','base_info','extra_info'
1. 插入数据(put命令,不能一次性插入多条)
hbase(main):012:0> put 'myns:user_info','001','base_info:username','张三'
2. scan扫描
hbase(main):024:0> scan 'myns:user_info'
3. 通过指定版本查询
hbase(main):024:0> scan 'myns:user_info', {RAW => true, VERSIONS => 1}
hbase(main):024:0> scan 'myns:user_info', {RAW => true, VERSIONS => 2}
4. 查询指定列的数据
hbase(main):014:0> scan 'myns:user_info',{COLUMNS => 'base_info:username'}
5. 分页查询
hbase(main):021:0> scan 'myns:user_info', {COLUMNS => ['base_info:username'], LIMIT => 10, STARTROW => '001'}
6. get查询
hbase(main):015:0> get 'myns:user_info','001','base_info:username'
hbase(main):017:0> put 'myns:user_info','001','base_info:love','basketball'
hbase(main):018:0> get 'myns:user_info','001'
7. 根据时间戳查询 是一个范围,包头不包尾
hbase(main):029:0> get 'myns:user_info','001', {'TIMERANGE' => [1571650017702, 1571650614606]}
8. hbase排序
插入到hbase中去的数据,hbase会自动排序存储:
排序规则: 首先看行键,然后看列族名,然后看列(key)名; 按字典顺序
9. 更新数据
hbase(main):010:0> put 'myns:user_info', '001', 'base_info:name', 'rock'
hbase(main):011:0> put 'myns:user_info', '001', 'base_info:name', 'eRRRchou'
10. incr计数器
hbase(main):053:0> incr 'myns:user_info', '002', 'base_info:age3'
11. 删除
hbase(main):058:0> delete 'myns:user_info', '002', 'base_info:age3'
12. 删除一行
hbase(main):028:0> deleteall 'myns:user_info','001'
13. 删除一个版本
hbase(main):081:0> delete 'myns:user_info','001','extra_info:feature', TIMESTAMP=>1546922931075
14. 删除一个表
hbase(main):082:0> disable 'myns:user_info'
hbase(main):083:0> drop 'myns:user_info'
15. 判断表是否存在
hbase(main):084:0> exists