big table
三个列.
group by 很麻烦
查询,连接(反复)很快
学生
key attribute value
1 name james
HBASE 逻辑模型
以表的形式存放数据
行键 时间戳 列族(1,2,3,4…)(列族需要提前定义)
更新是插入一个新行, 删除是打上一个删除标记.
HDFS 不能修改,追加也很困难, 所以hbase 会是这样
所有数据往内存里插, 内存满了才能往硬盘里插,一写就是一个块
抛弃是在重组的过程中完成的.
天生面向时间查询.(因为带时间戳)
访问表里的行有三种方式
1.1个
2.多个
3.全部
行键最大长度不超过64KB 按字典序列存储
列表示为 <列族>:<限定符>
按列族存储数据, 使用数据分析的场景,也适用于压缩
时间戳
可以自动生成,也可以显式赋值
Hbase 支持两种回收方式,指定个数的最新版本,或者指定时间的最新版本,7议案
元素由 行键 列族:限定符 时间戳 唯一决定
元素由字节码形式存放,没有类型之分的.
每一个列族是一个store 一个列族放在物理上也是一个store
每次进行CRUD 都会往memery 内存里写, 当写满了之后,就往硬盘里写
在这个过程中把一些过期的不要了的,删除掉,重组. Hfile
zookeeper 找到-ROOT- 表的位置 然后找到.META. 表 通过.META. 表中的region 信息,
hbase 只适合做key value 查询, 适合做大量写 和 一般读的场景.
hbase 和 hadoop 有版本配搭的限制. . 什么版本hbase 对什么版本的hadoop
hbase 下载路径. mirror.bjtu.edu.cn/apache/hbase/hbase-0.90.5/
配置 env.sh 文件
export Java_HOME=/usr/java/jdk1.6.0_29/
export HBASE_CLASSPATH=/home/gird/hadoop-0.20.2/conf
<property>
<name>hbase.rootdir</name> #设置hbase数据库存放数据的目录
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name> #打开hbase分布模式
<value>true</value>
</property>
<property>
<name>hbase.master</name> #指定hbase集群主控节点
<value>master:60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name> #指定zookeeper集群节点名<value>master,slave01,slave02</value>
</property>
配置一下conf/regionservers
h1 h3
为了防止hadoop依赖版本不匹配出现的问题,需要替换掉hbase自带的hadoop包,如下:
$ mv lib/hadoop-core-0.20-append-r1056497.jar lib/hadoop-core-0.20-append-r1056497.jar.bak
$ cp ../../hadoop-0.20.2/hadoop-0.20.2-core.jar lib
将配置好的hbase复制到两台slave机器上面
$ scp -r hbase-0.90.5 slave01:/home/yangze/soft/
systemctl stop firewalld.service
禁用防火墙
这里在安装的时候我出现了一个致命的错误.就是在复制代码得到时候把 里面的值给放在注释后面了.结果导致h0:60010/master.jsp 进不去, 报错是vlalue=””
hbase 查询数据库状态 status
请求帮助 help
version –查看当前版本
create ‘member’,’member_id’,’address’,’info’ –创建表
list –查看表信息
describe ‘member’ –desc 查看表的结构
alter ‘member’ ,{NAME=>’member_id’,METHOD=>’delete’} –删除表中字段
改变表之前要disable ‘member’
插入数据的时候要enable ‘member’
删除表
disable ‘member’
drop ‘member’
查询表是否存在
exists ‘member’
查看是否可用
is_enabled ‘member’
is_disabled ‘member’
插入记录
rowkey 新建一个列age
put’member’,’scutshuxue’,’info:age’,’24’
put’member’,’scutshuxue’,’address:province’,’zhejiang’
获取一个行键的所有数据
get’member’,’scutshuxue’
获取一个列族的所有数据 列键
get’member’,’scutshuxue’,’info’
每个列族里的一个列的所有数据
get’member’,’scutshuxue’,’info:age’
通过时间戳获得数据
get’member’,’scutshuxue’,(COLUMN=>’info:age’,TIMESTAMP=>132156)
全表扫描
scan ‘member’
删除指定行键的字段
delete ‘member’ ,’temp’,’info:age’
删除整行
deletaall ‘member’,’xiaofeng’
清空表
truncate ‘member’
什么时候用Hbase
成熟的数据分析主题查询模式已经确立并且不易轻易改变
传统的关系型数据库已经无法承受复合,高速插入,大量读取
适合海量,和简单(key-value)
场景一:历史浏览记录
关系型数据库的困难
简单的事情上了量也变成很困难的事情
order by 耗费性能
大量发生又无法分布式处理
顾客需要实时看到自己的足迹,因此不能使用缓存技巧
模式设计
不能分布式的
立项索引 reverse key 或者用hash等技巧改造行键
关系型
设置一个Log 表 记录每次用户点击,有三个列,时间戳,用户id 点击的主题ID
hbase
两个表,一个u-t,另一个t-u
u-t 行键userid 列族 thread:threadid
t-u 行键threadid 列族user:userid
查询-> 在t-u threadid->userid 然后在u-t表中userid->threaid
然后在应用程序里实现去重和统计功能
辅助索引
主表:行键为学号,列族为学生,下面的列是身份证号,姓名,性别,系,年龄
辅助(索引)表:行键为身份证号,列族和列为学号
复合行键设计
1234:2234:”hi lool”
1234:2235:”hi l22ool”
-
1234-2234:”hi lool”
1234-2235:”hi l22ool”