HBase 原理、Shell、API 读写操作
一、HBase 介绍
1)HBase 分布式、多版本、面向列的开源数据库
2)利用 Hadoop HDFS 作为文件存储系统,提供高可靠性、高性能、列存储、可伸缩、实时读写、适用于非结构化数据存储的数据库系统
3)利用 Hadoop MapReduce 来处理 Hbase 中的海量数据
4)利用 Zoopkeeper 作为分布式系统服务
二、特点
1)数据量大:一个表可以上亿行,上百万列(列多时,插入变慢)
2)面向列:面向列簇的存储和权限控制,列(族)独立检索
3)稀疏:对于为空(null)的列,并不占用存储空间
4)多版本:每个 cell 中数据有多个版本,默认版本号自动分配,是单元格插入时的时间戳
5)无类型:Hbase 中的数据都是字符串,没有类型
6)强一致性:同一行数据的读写只在同一台 Region Server 上进行
7)有限查询方式:仅支持三种扫描方式(单个 rowkey 查询,通过 rowkey 的 range 查询,全表扫描)
8)高性能随机读写
三、数据模型
1)行:同一个 key 对应所有数据
2)列族:相似的列数据通常被划分成一个列族
3)列:列名
4)Cell 及时间戳(版本)
每个 cell 有任意多的版本
建表时设置每个列族可以保留多个版本
5)三维有序
SortedMap(RowKey,
List(SortedMap(Column,
List(value,Timestamp))))
rowkey(ASC)+columnLabel(ASC)+Version(DESC)->value
HRegionServer 管理多个 HRegion
HRegion 首先将操作写入 HLog,将数据写入 MemStore 里面,MemStroe 达到一定阈值后,
Flush 到 StoreFile, StoreFile 达到阈值后,会 combine 到 HFile,写入到 Hadoop 集群中
Zookeeper:监控 HRegionServer 上线与下线的状态,启动会通知 HMaster
HMaster:负责负载均衡,以及 HRegionServer 的 HRegion 分配
HRegion:管理 MemStore,组合成大的 StoreFile,写入到 HDFS 集群中
META 表记录多个 region
ROOT 记录每个 region 所在 region server
ZooKeeper 找到 ROOT 表
META 表记录多个 region
ROOT 记录每个 region 所在 region server
ZooKeeper 找到 ROOT 表
四、Hbase 应用
配置 Hbase-env.sh
Hbase-site.xml
Regionserver
运行 start-hbase.sh
启动 hbase shell
Vim hbase-site.xml
Vim regionServer
./start-hbase.sh
jps
HQuorumPeer :Zoopkeeper
./hbase shell
list
Exit
./hadoop fs -ls /hbase 默认会建立/hbase 目录
Create ‘test’,’info’ info 列族
Put ‘test’,’row1’,’info:A’,’1’ row1:rowkey info:A 列族 1:值
Put ‘test’,’row1’,’info:’,’1’
Put ‘test’,’row1’,’info:B’,’1’
Scan ‘test’
更新
Put ‘test’,’row1’,’info:B’,’2’
Scan ‘test’
如何获取之间的版本(通过 api 方式)
Disable ‘test’
Drop ‘test’
List
api 操作
Configuraiton conf=new Configuration();
HBaseConfiguration hbconf=new HBaseConfiguration(conf);
HbaseAdmin admin=new HbaseAdmin(hbconf);
HTableDescriptor tableDesc=new HTableDescriptor(“test”);
tableDesc.addFamily(new HColumDescription(“info”));
admin.createTable(tableDesc);
List
Scan ‘test’
插入数据
Configuraiton conf=new Configuration();
HBaseConfiguration hbconf=new HBaseConfiguration(conf);
HTable table=new HTable(hbconf,”test”);
Put put=new Put(“row1”.getBytes()); //创建 rowKey
Put.add(“info”.getBytes(),”A”.getBytes(),”1”.getBytes()); //插入列族 Put‘test’,’row1’,’info:B’,’2’
table.put();
table.close();
Scan ‘test’
查找数据
Configuraiton conf=new Configuration();
HBaseConfiguration hbconf=new HBaseConfiguration(conf);
HTable table=new HTable(hbconf,”test”);
Scan scan=new Scan();
ResultScanner rs=table.getScanner(scan);
for(Result r:res){
for(KeyValue kv:r.row()){
System.out.println(“rowkey=>”+new String(r.getRow())
+”family=>”+new String(kv.getFamily()) 列族
+”qualfier=>”+new String(kv.getQualifier())列名
+”timestamp=>”+kv.getTimestamp()
+”value=>”+new String(kv.getValue())
);
}
}
评论