hbase,
物理数据模型其实就是将逻辑模型中的一个Row分割成为根据Column family存储的物理模型。对于BigTable的数据模型操作的时候,会锁定Row,并保证Row的原子操作。Hbase由行和列组成行按照((列族)) 划分每个列族在硬盘上都自己的HFile(二进制文件,不能直接读取)HFile:一个列族可以有多个HFile,但是一个HFile不能储存多个列族(Column),每个列族都有一个MemStore一行中的一个列族数据不一定存放在同一个HFile里,一行中的列族数据需要物理的存放在一起HBase表是横向划分为很多region的region是存放在不同的region server上的。
一个region里能存放一个列族或多个列族,一个列族(如果大的话)可以存放在多个region中
hbase的rowkey是按顺序存储的
管理用户对Table的增、删、改、查操作管理HRegionServer的负载均衡,调整Region分布在Region Split后,负责新Region的分配在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移
一个时间点只有一个HMaster在运行
HMaster是总的管理者,但一个HRegionServer挂了后,HMaster会把该HRegionServer下的Region挂在到其它HRegionServer下。
当一个Region不断的变大,该Region会分裂成多个Region,HMaster根据负载情况,将Region挂在到相应的HRegionServer下
安装hbase
1.去官网下载hbase
hbase.apache.org
2解压,将HBASE_HOME/bin设置到环境变量中
3修改HBASE_HOME/conf/hbase-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65
hbase自己管理zookeeper,如果你另外搭建了zookeeper集群,请把这个选项设置为false
export HBASE_MANAGES_ZK=true
4修改HBASE_HOME/conf/hbase-site.xml
在<configuration></configuration>中增加
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://wuke01:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>wuke01</value>
</property>
</configuration>
如果hadop不认识hbase
修改增加:hadoop-env.shexport HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/local/hbase-0.98.8/lib/*启动hbase
start-hbase.sh
启动hbase控制台
hbase shell
输入list查看所有表
搭建hbase集群模式
wuke01:namenode datanode HMaster HRegionServer
wuke02:datanode HRegionServer
wuke05:zookeeper
wuke06:zookeeper
wuke07:zookeeper
1.去官网下载hbase
hbase.apache.org
2解压,将HBASE_HOME/bin设置到环境变量中
3修改HBASE_HOME/conf/hbase-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65
4修改HBASE_HOME/conf/hbase-site.xml
在<configuration></configuration>中增加
<property> <name>hbase.tmp.dir</name> <value>/usr/local/hbase-0.98.8/tmp</value> </property> <property > <name>hbase.rootdir</name> <value>hdfs://wuke01:9000/hbase</value></property><property > <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>wuke05,wuke06,wuke07</value> </property>修改regionservers
wuke01
wuke02
如果是hbase1.3
修改hbase-site.xml
<configuration>
<property>
<name>hbase.tmp.dir</name>
<value>/app/hbase-1.3.0/tmp</value>
</property>
<property >
<name>hbase.rootdir</name>
<value>hdfs://cluster1/hbase</value>
</property>
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>bdpp01,bdpp02,bdpp03</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
</configuration>
<property>
<name>hbase.client.scanner.timeout.period</name>
<value>600000</value>
<description>in case of timeout when scan data is large</description>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>600000</value>
</property>
问题:hbase 不认识hadoop集群的nameservice
解决:将hadoop的core-site.xml hdfs-site.xml拷贝到hbase的conf目录下
hbase1.3启动验证
http://bdpp03:60010/procedures.jsp
常见错误
Hbase hbck 检查zookeeper连接错误:启动zkServer.shzookeeper会话过期:修改zoo.cfgmaxSessionTimeout=12000重启zookeeperor分配更大的守护内存,修改hbase-env.shexport HBASE_HEAPSEIZE=4000hbase shell
查看所有表
list
查看表的结构
# 语法:describe <table># 例如:查看表t1的结构describe ‘t1’注意:记得要加单引号 |
hbase客户端命令
| 名称 | 命令表达式 |
| 创建表 | create '表名称', '列族名称1','列族名称2','列族名称N' |
| 添加记录 | put '表名称', '行名称', ''列族名称:列名称', '值' |
| 查看记录 | get '表名称', '行名称' |
| 查看表中的记录总数 | count '表名称' |
| 删除记录 | delete '表名' ,'行名称' , '列名称' |
| 删除一张表 | 先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称' |
| 查看所有记录 | scan "表名称" |
| 查看某个表某个列中所有数据 | scan "表名称" , {COLUMNS=>'列族名称:列名称'} |
| 更新记录 | 就是重写一遍进行覆盖 |
create "stu","cf1","cf2"
put "stu","rowkey1",,"cf1:name","zhangsan"
get "stu","rowkey1"
下面给出的语法来改变列家族单元的最大数目。
alter 'stu' ,NAME=>'cf1',VERSIONS=>5
put 'stu','xiaoming','cf1:age','23'
put 'stu','xiaoming','cf1:age','24'
put 'stu','xiaoming','cf1:age','25'
put 'stu','xiaoming','cf1:age','26'
查询
get 'stu','xiaoming','cf1:age'
只会出现最后一次插入的数据cf1:age =26
如果想要看到全部的版本(5个版本)
get 'stu','xiaoming',{COLUMN=>'cf1:age',VERSIONS=>5}
get 'stu','xiaoming',{COLUMN=>'cf1:age',TIMESTAMP=>XXX}
scan 'stu',{LIMIT=>10}
删除xiaoming值的'info:age'字段>delete 'users','xiaoming','info:age'>get 'users','xiaoming'§删除整行>deleteall 'users','xiaoming'§统计表的行数>count 'users'§清空表>truncate 'users'
Hbase shell是JRuby写的,JRuby运行在JVM虚拟机中,所以HBase shell 中可以执行java方法scan 'stu'import java.util.DateDate.new(1429496444488).toStringimport org.apache.hadoop.hbase.util.Bytesimport org.apache.hadoop.hbase.filter.PrefixFilterscan "stu",{FILTER =>PrefixFilter.new(Bytes.toBytes('r')),COLUMN => 'cf'}API参考:http://hbase.apache.org/apidocs/index.html