最近在弄Flink的一个demo,其中用到了hbase,就顺便了解和使用了hbase,做个记录
## Hbase简介HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候,请考虑使用HBase!
HBase作为Google Bigtable的开源实现,Google Bigtable利用GFS作为其文件存储系统类似,则HBase利用Hadoop HDFS作为其文件存储系统;Google通过运行MapReduce来处理Bigtable中的海量数据,同样,HBase利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
HDFS与HBase比较
HDFS | HBase |
---|---|
HDFS适于存储大容量文件的分布式文件系统。 | HBase是建立在HDFS之上的数据库。 |
HDFS不支持快速单独记录查找。 | HBase提供在较大的表快速查找 |
HDFS提供了高延迟批量处理;没有批处理概念。 | HBase提供了数十亿条记录低延迟访问单个行记录(随机存取)。 |
HDFS提供的数据只能顺序访问。 | HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找。 |
特征
- 大:一个表可以有数十亿行,上百万列;
- 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索;
- 稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
- 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
- 数据类型单一:Hbase中的数据都是字符串,没有类型。
一些概念
- RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。
- Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
- Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加
- Version Number:类型为Long,默认值是系统时间戳,可由用户自定义
- Value(Cell):Byte array
Docker安装步骤
拉取镜像
Dockerhub上有很多镜像,找了一个不错的https://hub.docker.com/r/harisekhon/hbase
一般能用到的镜像,这哥们都给整理了https://github.com/HariSekhon/Dockerfiles
常用命令
容器起来后,我们进入容器内部,执行docker exec -ti e60a300f7749 /bin/bash
然后再执行hbase shell
得到如下
1 | bash-4.4# hbase shell |
我们可以使用help 'create'
的方法查看某命令的使用帮助
- 查看集群状态
status
- 查看hbase版本
version
- 查看所有表
list
- 创建表
create 't1','[Column Family 1]','[Column Family 2]'
例如创建一个菜谱表,调味料为一个列族(类),食材则为另一个列族(类),脚本为create 'cookbook','seasoning','ngredients'
- 查看表的结构
describe 't1'
- 删除表
disable 't1'
之后drop 't1'
- 检查表是否存在
exists 't1'
- 获取表中所有数据
scan 't1'
- 获取表中前10行数据
scan 't1',{LIMIT=>10}
- 获取指定column(ad:pv)的前10行数据
scan 't1',{COLUMNS=>['ad:pv'],LIMIT=>10}
- 加Filter:如过滤rowkey以“2015”开头的前10行数据
scan 't1',{FILTER=>"PrefixFilter('2015')",LIMIT=>10}
- 查询rowkey=001下所有的数据
get 't1','001'
- 查询rowkey=001下family=ad,column=pv
get 't1','001','ad:pv'
或者get 't1','001',{COLUMN=>'ad:pv'}
- 添加数据
put <table>,<rowkey>,<family:column>,<value>,<timestamp>
例如:向’t1’表中添加rowkey=002,family=ad,column=pv,value=1000,时间戳默认put 't1','002','ad:pv','1000'
- 删除rowkey=002的所有数据
deleteall 't1','002'
- 删除rowkey=002中ad:pv数据
delete 't1','002','ad:pv'
- 清空表
truncate 't1'
- 统计行数
count 't1'
- 查询表t1中的行数,每100条显示一次
count 't1',{INTERVAL=>100}
springboot整合hbase
这里使用的是hbase-client
代码在github上,直接可以用
1 | . |