1. HBase
一个构建在HDFS上的高可靠、高性能、面向列、可伸缩、分布式列存储开源数据库,主要用于存储海量数据,同时使用mapreduce处理HBase中的数据,利用zookeeper作为协同服务。读写相对简单,不支持条件查询
2. HBase与HDFS对比
都具有良好的容错性和扩展性
HDFS适合批处理场景,但是不支持数据随即查找,不适合增量数据处理,不支持数据更新
3. HBase的特点:
海量数据:可支持上百万列,分成多个region
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列
面向列存储:面向列的存储和权限控制,列独立检索
记录稀疏:列为空(NULL),并不占用存储空间
数据多版本:每个单元的数据可以有多个版本,通过timestamp区分
数据类型单一:所有数据都是字符串
4. HBase结构组成
Row key:
Byte array
表中每条记录的“主键”
方便快速查找
Timestamp:
每次数据操作对应的时间戳,看作数据的version number
Column Family:
拥有一个名称(string)
包含一个或者多个相关列(Column)
Column:
value:
5. 支持的操作
所有操作基于rowkey的
支持CRUD(create、read、update、delete)以及put、get、multiput、scan
没有内置join操作,可使用MapReduce实现
6. HBase为每个值维护了多级索引,即<key,column family,column name,timestamp>
Table中的所有行都按照row key的字典序排列,在行的方向上分割为多个region,region是HBase中分布式存储与负载均衡的最小单元,不同的Region分布到不同RegionServer上;
region增大到一个阀值的时候,region就会分为两个新的region,之后会有越来越多的region
region由一个或多个store组成,每个store保存一个columns family
每个store又由一个memStore和0至多个StoreFile组成;
memStore存储在内存中,StoreFile存储在HDFS上
7. HBase的基本组件
Client:通过RPC与HMaster及HRegionServer进行通信,并维护cache加快对HBase的访问
Zookeeper:
保证集群中总是存在一个HMaster
存储所有Region的寻址入口
实时监控Region server的上线和下线信息,并实时通知给Master
存储HBase的schema和table元数据
HMaster:
为Region server分配region
复杂Region server的负载均衡
发现失效的Region server并重新分配其上的region
管理用户对table的增删改查操作
HRegionServer:
维护region,处理对region的I/O请求
负责切分在运行过程中变得过大的region
8.HBase容错机制
HMaster:zookeeper重新选择一个新的Master
无Master过程中,数据读取仍照常进行
无Master过程中,region切分、负载均衡等无法进行
HRegionServer容错:定时向Zookeeper汇报心跳,如果一定时间内未出现心跳
HMaster将该HRegionServer上的Region重新分配到其他RegionServer上
失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer上
9. HBase访问方式
Native Java API:常规高效
创建一个Configuration对象(包含各种配置信息hbase-default.xml,hbase-site.xml)
Configuration conf=HbaseConfiguration.create()
构建一个HTable句柄(提供Configuration对象,提供待访问Table的名称)
HTable table=new HTable(conf,tableName)
仅提供行级事务,严格的行一致性,并发读,顺序写
执行操作(支持put,get,delete,scan等的批处理)
table.getTableName();
关闭HTable句柄(内存数据刷新到磁盘上,释放资源)
table.close()
HBase Shell:用于管理
Thrift Gateway:序列化,支持C++,Python等语言
启动thrift server:hbase-daemon.sh start thtift
生成Hbase thrift client接口文件
thrift --gen xxx Hbase.thrift
编写客户端代码
eg:1. thrift --gen py hbase.thrift
2. ${HBASE_HOME}/src/examples/thrift/DemoClient.py
3. python DemoClient.py
Rest Gateway:Rest风格的Http API
Mapreduce:使用Mapreduce作业处理Hbase数据
提供TableMapper、TableReducer、TableInputFormat、TableOutputFormat等api
10.HBase Shell的主要用法
进入控制台:bin/hbase shell
创建表:create TABLE_NAME,COLUMN_Family1, COLUMN_Family2,...COLUMN_FamilyN
添加记录:put TABLE_NAME,ROW_NAME,COLUMN_Family:COLUMN_NAME,VALUE
查看记录:get TABLE_NAME,ROW_NAME #默认返回最近的值
统计记录数:count TABLE_NAME
删除表:
disable TABLE_NAME
drop TABLE_NAME
删除记录:
delete TABLE_NAME,ROW_NAME,COLUMN_Family:COLUMN_NAME #删除一条
delete TABLE_NAME,ROW_NAME #删除所有
删除一个列簇
disable TABLE_NAME
alter TABLE_NAME, {NAME=>‘tab1_add‘, METHOD=>‘delete‘}
enable TABLE_NAME
全表扫描:
scan TABLE_NAME
指定列中的所有数据:scan TABLE_NAME,COLUMN_Family
查看所有表:list
查看服务器状态:status
查看hbase版本:version
查看表结构:descirbe TABLE_NAME
判断表是否存在:exists TABLE_NAME
判断表是否为enable is_enabled TABLE_NAME
清空表:truncate TABLE_NAME