对Hbase的基础认知
HBase适用于:
持久化存储大量数据(TB、PB)
对扩展伸缩性有要求
需要良好的随机读写性能
简单的业务KV查询(不支持复杂的查询比如表关联等)
能够同时处理结构化和非结构化的数据
订单流水、交易记录、需要记录历史版本的数据等
不适用于(适用于RDBMS):
几千、几百万数据
需要类型列(不过已经可以用Phoniex on HBase解决这个问题)
需要跨行事务,目前HBase只支持单行事务,需要跨行必须依赖第三方服务
SQL查询(不过可以用Phoniex on HBase解决这个问题)
硬件太少,因为HBase依赖服务挺多,比如至少5个HDFS DataNode,1个HDFS NameNode(为了安全还需要个备节点),一个Zookeeper集群,然后还需要HBase自身的各节点
需要表间Join。HBase只适合Scan和Get,虽然Phoenix支持了SQL化使用HBase,但Join性能依然很差。如果非要用HBase做Join,只能再客户端代码做
Hbase和Phoenix的差异
1 Phoenix中建立的表,在Hbase中可查,但是Hbase中建的表,在Phoenix中不可查询
2 Phoenix支持join,Hbase不可以
Hbase操作
在hbase
hbase shell 进入命令行
//下面操作一定要带上引号
drop 't1' 删除表
# 获取整个表的值
scan 'flinkcdcresult1'
disable 'FLINKCDCRESULT'
drop 'FLINKCDCRESULT' 禁用后才能删除表
create 'FLINKCDCRESULT', {NAME=>'f'}
--增加数据
put'FLINKCDCRESULT', '001','f:times','13309882999'
put'FLINKCDCRESULT', '001','f:temp','31'
通用性解释
创建表 create '表名', '列族名1','列族名2','列族名N'
创建表只用创建列族,然后插入数据的时候指定列就能新增列
查看所有表 list
描述表 describe '表名'
判断表存在 exists '表名'
判断是否禁用启用表 is_enabled '表名', is_disabled '表名'
添加记录 put '表名', 'rowKey', '列族 : 列' , '值'
查看记录rowkey下的所有数据 get '表名' , 'rowKey'
查看表中的记录总数 count '表名'
获取某个列族 get '表名','rowkey','列族'
获取某个列族的某个列 get '表名','rowkey','列族:列'
删除记录 delete '表名' ,'行名' , '列族:列'
删除整行 delete all '表名','rowkey'
删除一张表 先要屏蔽该表,才能对该表进行删除 ,第一步 disable '表名' ,第二步 drop '表名'
清空表 truncate '表名'
查看所有记录 scan '表名'
查看某个表某个列中所有数据 scan '表名' , {COLUMNS=>'列族名:列名'}
更新记录 就是重写一遍,进行覆盖,hbase没有修改,都是追加
对于一些解释
HBase Shell语法中,所有字符串参数都必须包含在单引号中,且区分大小写,
如 Student 和 student 代表两个不同的表。
另外,在上条命令中没有对列族参数进行定义,因此使用的都是默认参数,
如果建表时要设置列族的参数,参考以下方式:
create 'Student',{NAME=>'Stulnfo',VERSIONS=>3},{NAME=>'Grades',BLOCKCACHE=>true}
大括号内是对列族的定义,NAME、VERSION 和 BLOCKCACHE 是参数名,无须使用单引号,
符号=>表示将后面的值赋给指定参数。例如,VERSIONS => 3是指此单元格内的数据可以保留最近的 3 个版本,
BLOCKCACHE => true指允许读取数据时进行缓存。
创建表结构以后,可以使用 exsits 命令查看此表是否存在.
建表查看测试
create 'hbase_test', '列族名1','列族名2','列族名N'
操作hbase数据:
表有两个列族,列族1和列族2,其中列族1和列族2下分别有两个列name和age,phone和address
| | 列族1 | 列族2 |
| |name age | phone address|
|001 |Tom 18 | 110 wuhan |
注意:hbase的表只动态加入列的,比如说列族1下面有两列,再添加数据时,可以在动态的加一列。
1 创建表hbase_test有两个列族CF1和CF2
hbase(main):041:0>create 'hbase_test', {NAME=>'cf1'},{NAME=>'cf2'}
注意:shell语句后跟分号表示语句还没有,这一点恰恰和mysql相反(我的理解)
这样表结构就起来了,其实比较自由,列族里边可以自由添加子列很方便。如果列族下没有子列,cf1:name加不加冒号都是可以的,也可以写成cf1name
如果在添加数据的时候,需要手动的设置时间戳,则在put命令的最后加上相应的时间戳,时间戳是long类型的,所以不需要‘加引号
Hbase(main):045:0>put'hbase_test', '001','cf2:phone','13309882999',1478053832459
3 查看表中的所有数据
hbase(main):046:0>scan 'hbase_test'
ROW COLUMN+CELL
001 column=cf1:name, timestamp=1478053832459, value=Tom
001 column=cf1:age, timestamp=1478053787178, value=18
001 column=cf:phone, timestamp=1478053848225, value=13309882999
001 column=cf2:address, timestamp=1478053858144, value=昆明
row(s)in0.0140seconds
因为表中只有一条数据,所以结果和下面查询一条数据的结果相同
4 查看其中某一个Key的数据
hbase(main):048:0>get'hbase_test','001'
COLUMN CELL
001 column=cf1:name, timestamp=1478053832459, value=Tom
001 column=cf1:age, timestamp=1478053787178, value=18
001 column=cf:phone, timestamp=1478053848225, value=13309882999
001 column=cf2:address, timestamp=1478053858144, value=昆明
一条hbase命令只允许更新一个column
/opt/cloudera/parcels/PHOENIX-5.0.0-cdh6.2.0.p0.1308267/lib/phoenix/bin/sqlline.py
./sqlline.py 10.129.37.71:2181
CREATE TABLE flinkcdcresult (
id varchar ,
times varchar,
temp double
CONSTRAINT my_pk PRIMARY KEY (id)
);
查看
!tables
select * from !;