http://hbase.apache.org/1.1/book.html
http://blog.csdn.net/u010270403/article/details/51648462
- 命令
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50-- cli启动
hbase shell
-- 列出表:
list
list 'pipe.*' -- 可以使用正则,列出pipe开头的表.
-- 建表mytable,族名是cf:
create 'mytable','cf'
-- 写数据:
put 'mytable', 'first','cf:message','hello HBase'
# 在mytable表的插入rowkey为first的数据,列族为cf,列名message,具体数据为hello HBase.
put 'mytable', 'second','cf:foo',0x0
put 'mytable', 'third','cf:bar',3.15159
put 'mytable', 'forth','cf:kk','kk',3.15159
-- 最后一个kk的3.15159被识别成timestamp写入了.
-- 看得出出来字符串需要单引号,数字则不需要
-- 不加字符串,不会被识别为表名或者列名,会被识别为函数名
-- 读数据:
get 'mytable','first'
-- 读整表:
scan 'mytable'
-- 输出:
hbase(main):031:0> scan 'MYTABLE'
ROW COLUMN+CELL
112233bbbcccc column=NEWCF:attr, timestamp=1497410919789, value=data
-- 表名不一定大写,行键112233bbbcccc,列族为NEWCF,列名(qualifier)为attr,值为data.
-- 删除指定数据
delete ‘scores','Jim','grade'
delete ‘scores','Jim'
-- 删除整行:
deleteall ‘scores','Jim'
-- 删除整个表:
truncate ‘scores'
-- 更改表结构:
disable ‘scores'
alter ‘scores',NAME=>'info'
enable ‘scores'
-- 增加列族名
alter 'zmtest1', NAME => 'cf'
-- 删除一个列族
hbase> alter ‘t1′, NAME => ‘f1′, METHOD => ‘delete'
hbase> alter ‘t1′, ‘delete' => ‘f1′
-- 执行脚本
hbase shell test.hbaseshell
--
HBASE写数据先写Memstore和WAL,最后由Memstore生成HFile.
每个列族可能有多个HFile,但每个HFile只能属于一个列族.
不清楚为什么WAL在Memstore前. 可能因为MemStore需要rpc,比较慢吧.
写操作生成:
- 数据= Memstore+HFile(StoreFile)
- 日志= WAL (HLog)
读操作使用LRU算法,缓存名为BlockCache,与Memstore在一个JVM中.
HFile的物理存放形式是一个Block的序列外加这些Block的索引.
读路径包括:BlockCache,Memstore,HFile,将缓存的\未缓存未写入的\已写入的,三部分数据凑在一起返回客户端.
#表设计:
Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。
存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
注意:
字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
列名都以列族作为前缀,例如courses:history , courses:math 都属于 courses 这个列族.
python api:happybase
首先在master上启动thrfit接口,注意happybase
只能访问thrift接口,因此不是start thrift2:
1 | ./hbase-daemon.sh start thrift |
python安装库:
1 | pip install happybase |
python代码:
1 | #!/usr/bin/env python |
#建立结构相同的表habse
没有传统数据库中类似create table like
的语句.
如果要建立一个与现有表结构相同的表,只能使用如下步骤:(假设要达到的目的是create table 'pipe:zeb_log' like 'pipe_day'
)
1 | // 1. 获取原表结构: |
HBase导出数据
- 导出成
SequenceFile
:// 没啥用,无法解析.1
2
3
4hbase org.apache.hadoop.hbase.mapreduce.Export pipe:zeb_log /user/fengmq01/zeb_log
# 把 pipe:zeb_log 导出到了 /user/fengmq01/zeb_log 文件夹
# 命令格式:
# hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]]
数据结构
使用上可以简单得想象成一个树形结构:
Table(Rows) –通过row key 索引到=> Row ;
Row –通过column family索引到CF;
CF – 通过column qualifier 索引到最新版本的Value.
不同timestamp的value组成Cell.
1 | Table(Rows)->CF->Cell->Value. |
每一级都是一个KV存取.