QuorumPeerMain
:是zookeeper集群的启动入口类,是用来加载配置启动QuorumPeer线程的。
Store
memstore 128m 满了 刷盘
storefile 是对HFile 的上层封装
HFile 真正存储的文件
为什么order数据就在01节点
HBase shell操作
1、进入HBase客户端命令操作界面
$ bin/hbase shell
2、查看帮助命令
hbase(main):001:0> help
3、查看当前数据库中有哪些表list
hbase(main):002:0> list
4、创建一张表
创建user表,包含info、data两个列族
hbase(main):010:0> create 'user', 'info', 'data'
或者
hbase(main):010:0> create 'user1', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}
5、添加数据操作
向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
hbase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'
向user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为female
hbase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female'
向user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20
hbase(main):013:0> put 'user', 'rk0001', 'info:age', 20
向user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为picture
hbase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'
6、查询数据操作
1、通过rowkey进行查询
获取user表中row key为rk0001的所有信息
hbase(main):015:0> get 'user', 'rk0001'
查到的内容是在缓存中,还未上传
手动刷盘
或隔1小时,或存满128m 自动刷盘
2、查看rowkey下面的某个列族的信息
获取user表中row key为rk0001,info列族的所有信息
hbase(main):016:0> get 'user', 'rk0001', 'info'
3、查看rowkey指定列族指定字段的值
获取user表中row key为rk0001,info列族的name、age列标示符的信息
hbase(main):017:0> get 'user', 'rk0001', 'info:name', 'info:age'
4、查看rowkey指定多个列族的信息
获取user表中row key为rk0001,info、data列族的信息
hbase(main):018:0> get 'user', 'rk0001', 'info', 'data'
或者你也可以这样写
hbase(main):019:0> get 'user', 'rk0001', {COLUMN => ['info', 'data']}
或者你也可以这样写,也行
hbase(main):020:0> get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}
5、指定rowkey与列值查询 FILTER
获取user表中row key为rk0001,cell的值为zhangsan的信息
cell
:单元格
hbase(main):030:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}
6、指定rowkey与列值模糊查询
获取user表中row key为rk0001,列标示符中含有a的信息
hbase(main):031:0> get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
继续插入一批数据
hbase(main):032:0> put 'user', 'rk0002', 'info:name', 'zhangfei'
hbase(main):033:0> put 'user', 'rk0002', 'info:gender', 'female'
hbase(main):034:0> put 'user', 'rk0002', 'info:nationality', '中国'
hbase(main):035:0> get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}
7、查询所有数据
查询user表中的所有信息
scan 'user'
8、列族查询
查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
9、多列族查询
查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
10、指定列族与某个列名查询
查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
11、指定列族与列名以及限定版本查询
查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
12、指定多个列族与按照数据值模糊查询
查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
13、rowkey的范围值查询
查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
14、指定rowkey模糊查询
查询user表中row key以rk字符开头的
scan 'user',{FILTER=>"PrefixFilter('rk')"}
15、指定数据范围值查询
查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
7 更新数据操作
-
更新数据值
更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加 -
更新版本号
将user表的info列族版本号改为5hbase(main):050:0> alter 'user', NAME => 'info', VERSIONS => 4
8 删除数据以及删除表操作
注意:
HBase 不是立即删除 (逻辑删除)
真正的删除是在合并时才会删除(物理删除),默认每隔一个小时合并一次
-
指定rowkey以及列名进行删除
删除user表row key为rk0001,列标示符为info:name的数据hbase(main):045:0> delete 'user', 'rk0001', 'info:name'
-
指定rowkey,列名以及字段值进行删除
删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据delete 'user', 'rk0001', 'info:name', 1392383705316
-
删除一个列族
删除一个列族:alter 'user', NAME => 'info', METHOD => 'delete' 或 alter 'user', 'delete' => 'info'
-
清空表数据
hbase(main):017:0> truncate 'user'
-
删除表
首先需要先让该表为disable状态,使用命令:hbase(main):049:0> disable 'user'
然后才能drop这个表,使用命令:
hbase(main):050:0> drop 'user'
(注意:如果直接drop表,会报错:Drop the named table. Table must first be disabled)
9 统计一张表有多少行数据
hbase(main):053:0> count 'user'
10 查看表结构信息
hbase(main):053:0> describe 'user'
desc
HBase 的 java 开发
依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
创建表myuser
@Test
public void createTable() throws IOException {
//创建配置文件对象,并指定zookeeper的连接地址
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort", "2181");
configuration.set("hbase.zookeeper.quorum", "hadoop01,hadoop02,hadoop03");
//集群配置
//configuration.set("hbase.zookeeper.quorum", "101.236.39.141,101.236.46.114,101.236.46.113");
Connection connection = ConnectionFactory.createConnection(configuration);
Admin admin = connection.getAdmin();
//添加列族
//创建myuser表,包括f1,f2两个列族
//创建两个列族的表述符
ColumnFamilyDescriptor f1 = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes()).build();
ColumnFamilyDescriptor f2 = ColumnFamilyDescriptorBuilder.newBuilder("f2".getBytes()).build();
//通过TableDescriptorBuilder来实现我们表的参数设置,包括表名,列族等等
TableDescriptor tb = TableDescriptorBuilder
.newBuilder(TableName.valueOf("myuser"))
.setColumnFamily(f1)
.setColumnFamily(f2)
.build();
//创建表
boolean myuser = admin.tableExists(TableName.valueOf("myuser"));
if(!myuser){
admin.createTable(tb);
}
//关闭客户端连接
admin.close();
}
向表中添加数据
@Test
public void addData() throws IOException {
//连接
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop01:2181");
Connection connection = ConnectionFactory.createConnection(conf);
//dml操作
Table myuser = connection.getTable(TableName.valueOf("myuser"));
//put 对象的定义
Put put = new Put("0001".getBytes());
put.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(1));//
put.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("zhangsan"));
put.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(20));
put.addColumn("f2".getBytes(), "address".getBytes(), "北京".getBytes());
put.addColumn("f2".getBytes(), "phone".getBytes(), "123231212".getBytes());
//插入数据
myuser.put(put);
//关闭资源
myuser.close();
connection.close();
}
全盘扫描
@Test
public void scanAllData() throws IOException {
//连接
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop01:2181");
Connection connection=ConnectionFactory.createConnection(conf);
//获取table对象
Table myuser=connection.getTable(TableName.valueOf("myuser"));
//定义一个Scan对象
Scan scan=new Scan();
//查询范围是左闭右开
//scan.setStartRow("0002".getBytes());
//scan.setStopRow("0005".getBytes());
ResultScanner scanner = myuser.getScanner(scan);
//for循环获取每一个result结果集
for (Result result : scanner) {
System.out.println(
Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes() )));
System.out.println(
Bytes.toInt(result.getValue("f1".getBytes(),"age".getBytes() )));
System.out.println(
Bytes.toString(result.getValue("f2".getBytes(),"address".getBytes() )));
}
//关闭资源
myuser.close();
connection.close();
}
根据rowkey 删除数据
@Test
public void deleteByRowKey() throws IOException {
//获取连接
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop01:2181,hadoop02:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
//
Table myuser = connection.getTable(TableName.valueOf("myuser"));
Delete delete = new Delete("0001".getBytes());
//
myuser.delete(delete);
//
myuser.close();
connection.close();
}
删除表
注意:删除表要先disableTable
@Test
public void deleteTable() throws IOException {
//获取连接
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop01:2181,hadoop02:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Admin admin = connection.getAdmin();
admin.disableTable(TableName.valueOf("myuser"));
admin.deleteTable(TableName.valueOf("myuser"));
//
admin.close();
connection.close();
}
HBase的表数据模型
数据的排序是按照字典排序
注意:
字典序对int排序的结果是
1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
Row Key 的设计
hbase rowkey设计原则
查找相关问题
数据量非常大时 ,避免产生热点问题