- HBase简介
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具
- 主键:Row Key
主键是用来检索记录的主键,访问hbase table中的行,只有三种方式
通过单个row key访问
通过row key的range
全表扫描
- 列族:Column Family
列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型
- 时间戳:timestamp
HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引
- HBASE基础知识
物理存储
Table 在行的方向上分割为多个HRegion,一个region由[startkey,endkey)表示,每个HRegion分散在不同的RegionServer中
架构体系
- i. Client 包含访问hbase 的接口,client 维护着一些cache 来加快对hbase 的访问,比如regione 的位置信息
- ii. Zookeeper
- 保证任何时候,集群中只有一个running master
- 存贮所有Region 的寻址入口
- 实时监控Region Server 的状态,将Region server 的上线和下线信息,实时通知给Master
- 存储Hbase 的schema,包括有哪些table,每个table 有哪些column family
- iii. Master 可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行
- 为Region server 分配region
- 负责region server 的负载均衡
- 发现失效的region server 并重新分配其上的region
HBase中有两张特殊的Table,-ROOT-和.META.
-ROOT- :记录了.META.表的Region信息,-ROOT-只有一个region
.META. :记录了用户创建的表的Region信息,.META.可以有多个regoin
Zookeeper中记录了-ROOT-表的location
Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问
- Region Server
1、维护Master 分配给它的region,处理对这些region 的IO 请求
2、负责切分在运行过程中变得过大的region
可以看出,client 访问hbase 上数据的过程并不需要master 参与,寻址访问先zookeeper再regionserver,数据读写访问regioneserver。HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
- Hbase表存储结构:
- HBASE Shell的DDL操作
名称 |
命令表达式 |
创建表 |
create ‘表名称‘, ‘列族名称1‘,‘列族名称2‘,‘列族名称N‘ |
添加记录 |
put ‘表名称‘, ‘行名称‘, ‘列名称:‘, ‘值‘ |
查看记录 |
get ‘表名称‘, ‘行名称‘ |
查看表中的记录总数 |
count ‘表名称‘ |
删除记录 |
delete ‘表名‘ ,‘行名称‘ , ‘列名称‘ |
删除一张表 |
先要屏蔽该表,才能对该表进行删除,第一步 disable ‘表名称‘ 第二步 drop ‘表名称‘ |
查看所有记录 |
scan "表名称" |
查看某个表某个列中所有数据 |
scan "表名称" , {COLUMNS=>‘列族名称:列名称‘} |
更新记录 |
就是重写一遍进行覆盖 |
1、 创建表
>create ‘users‘,‘user_id‘,‘address‘,‘info‘
表users,有三个列族user_id,address,info
2、 列出全部表
>list
3、 得到表的描述
>describe ‘users‘
4、 创建表
>create ‘users_tmp‘,‘user_id‘,‘address‘,‘info‘
5、 删除表
>disable ‘users_tmp‘
>drop ‘users_tmp‘
- HBASE Shell的DML操作
1、 添加记录
put ‘users‘,‘xiaoming‘,‘info:age‘,‘24‘;
put ‘users‘,‘xiaoming‘,‘info:birthday‘,‘1987-06-17‘;
put ‘users‘,‘xiaoming‘,‘info:company‘,‘alibaba‘;
2、 获取一条记录
1.取得一个id的所有数据
>get ‘users‘,‘xiaoming‘
2.获取一个id,一个列族的所有数据
>get ‘users‘,‘xiaoming‘,‘info‘
3.获取一个id,一个列族中一个列的
所有数据
get ‘users‘,‘xiaoming‘,‘info:age‘
3、 更新记录
>put ‘users‘,‘xiaoming‘,‘info:age‘ ,‘29‘
>get ‘users‘,‘xiaoming‘,‘info:age‘
>put ‘users‘,‘xiaoming‘,‘info:age‘ ,‘30‘
>get ‘users‘,‘xiaoming‘,‘info:age‘
4、 获取单元格数据的版本数据
>get ‘users‘,‘xiaoming‘,{COLUMN=>‘info:age‘,VERSIONS=>1}
>get ‘users‘,‘xiaoming‘,{COLUMN=>‘info:age‘,VERSIONS=>2}
>get ‘users‘,‘xiaoming‘,{COLUMN=>‘info:age‘,VERSIONS=>3}
5、 获取单元格数据的某个版本数据
〉get ‘users‘,‘xiaoming‘,{COLUMN=>‘info:age‘,TIMESTAMP=>1364874937056}
6、 全表扫描
>scan ‘users‘
- HBASE的Java_API(一)
11. import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import org.jruby.RubyProcess; import org.junit.Before; import org.junit.Test; import java.io.IOException; /** * Created by Administrator on 2017/3/13. */ public class Application { private Configuration conf = null; @Before public void init(){ conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "hadoop4:2181,hadoop5:2181,hadoop6:2181"); } @Test public void testDrop() throws IOException { HBaseAdmin admin=new HBaseAdmin(conf); admin.disableTable("account"); admin.deleteTable("account"); admin.close(); } @Test public void testPut() throws IOException { HTable table=new HTable(conf,"book"); Put put =new Put(Bytes.toBytes("book0005")); put.add(Bytes.toBytes("dock1"),Bytes.toBytes("info"),Bytes.toBytes("liuyan")); table.put(put); table.close(); } @Test public void testGet() throws IOException { HTable table =new HTable(conf,"book"); Get get=new Get(Bytes.toBytes("book0001")); get.addColumn(Bytes.toBytes("dock1"),Bytes.toBytes("info")); get.addColumn(Bytes.toBytes("dock1"),Bytes.toBytes("isbn")); Result result=table.get(get); for (KeyValue kv: result.list()) { String family =new String( kv.getFamily()); System.out.print(family); String clum=new String(kv.getQualifier()); System.out.print(clum); System.out.print(new String(kv.getValue())); } } @Test public void testDel() throws IOException { HTable table=new HTable(conf,"book"); Delete delete=new Delete(Bytes.toBytes("book0001")); delete.deleteColumn(Bytes.toBytes("dock1"),Bytes.toBytes("info")); table.delete(delete); table.close(); } @Test public void testScan() throws IOException { HTablePool pool=new HTablePool(conf,10); HTableInterface hTableInterface=pool.getTable("book"); Scan scan=new Scan(Bytes.toBytes("book0001"),Bytes.toBytes("book0005")); scan.addFamily(Bytes.toBytes("dock1")); ResultScanner results= hTableInterface.getScanner(scan); for (Result t : results){ byte[]value=t.getValue(Bytes.toBytes("dock1"),Bytes.toBytes("isbn")); System.out.print(new String(value)); } } public static void main(String[] args) throws IOException { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "hadoop4:2181,hadoop5:2181,hadoop6:2181"); HBaseAdmin admin = null; try { admin = new HBaseAdmin(conf); } catch (IOException e) { e.printStackTrace(); } HTableDescriptor td = new HTableDescriptor(TableName.valueOf("htable")); HColumnDescriptor cd = new HColumnDescriptor("info"); cd.setMaxVersions(10); td.addFamily(cd); admin.createTable(td); admin.close(); // System.out.print("11111111111"); } }