hbase之认识
进入HBase客户端命令操作界面 $ bin/hbase shell
查看帮助命令 hbase(main):001:0> help
查看当前数据库中有哪些表 hbase(main):002:0> list
创建一张表 hbase(main):003:0> create 'student','info'
向表中存储一些数据
hbase(main):004:0> put 'student','1001','info:name','Thomas'
hbase(main):005:0> put 'student','1001','info:sex','male'
hbase(main):006:0> put 'student','1001','info:age','18'
扫描查看存储的数据 hbase(main):007:0> scan 'student'
或:查看某个rowkey范围内的数据
hbase(main):014:0> scan 'student',{STARTROW => '1001',STOPROW => '1007'}
查看表结构hbase(main):009:0> describe ‘student’
更新指定字段的数据
hbase(main):009:0> put 'student','1001','info:name','Nick'
hbase(main):010:0> put 'student','1001','info:age','100'
查看更新后的数据:
查看指定行的数据
hbase(main):012:0> get 'student','1001'
或:查看指定行指定列或列族的数据
hbase(main):013:0> get 'student','1001','info:name'
删除数据:
删除某一个rowKey全部的数据
hbase(main):015:0> deleteall 'student','1001'
删除掉某个rowKey中某一列的数据
hbase(main):016:0> delete 'student','1001','info:sex'
清空表数据
hbase(main):017:0> truncate 'student'
删除表
首先需要先让该表为disable状态,使用命令:
hbase(main):018:0> disable 'student'
然后才能drop这个表,使用命令:
hbase(main):019:0> drop 'student'
统计一张表有多少行数据
hbase(main):020:0> count 'student'
---------------------------------------------------------hbase 使用----------------------------------------------
一、将HBase的jar包及hbase-site.xml添加到IDE
1、到安装HBase集群的任意一台机器上找到HBase的安装目录,到lib目录下下载HBase需要的jar包,然后再到conf目录下下载hbase-site.xml。
2、在ide中新建一个java项目,然后再右击"项目名",新建2个文件夹,分别是"lib"和"conf"
3、将1步骤中下载的jar包放到2步骤中的lib目录下,并且将hbase-site.xml放到conf目录下,并将2个文件夹添加到classpath下。
二、使用HBase的基本API操作HBase
通过编码(java)的形式对HBase进行一系列的管理涉及到对表的管理、数据的操作等。
下面这段是公共代码片段:
private static Configuration conf = null;
static {
Configuration HBASE_CONFIG = new Configuration();
// 与hbase/conf/hbase-site.xml 中 hbase.zookeeper.quorum 配置的值相同
HBASE_CONFIG.set("hbase.zookeeper.quorum", "c7004,c7003,c7005");
// 与hbase/conf/hbase-site.xml 中 hbase.zookeeper.property.clientPort 配置的值相同
HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181");
conf = HBaseConfiguration.create(HBASE_CONFIG);
}
1、对表的创建、删除、显示以及修改等,可以用Admin, 一旦创建了表,那么可以通过HTable的 实例来访问表,每次可以往表里增加数据。
/**
* 创建表
* @param tableName 表名称
* @param familys 列族
* @param force 是否强制建表
* @throws Exception
*/
public static void creatTable(String tableName, String[] familys,boolean force) throws Exception {
//建立连接
Connection conn = ConnectionFactory.createConnection(conf);
//表管理类
Admin admin = conn.getAdmin();
if (admin.tableExists(TableName.valueOf(tableName))) {
if(force){
//禁用表
admin.disableTable(TableName.valueOf(tableName));
//删除表
admin.deleteTable(TableName.valueOf(tableName));
System.out.println("开始创建表!");
}else{
System.out.println("表已存在!");
}
} else {
//定义表名
HTableDescriptor tblDesc = new HTableDescriptor(TableName.valueOf(tableName));
for (int i = 0; i < familys.length; i++) {
//定义列族
HColumnDescriptor clmDesc = new HColumnDescriptor(familys[i]);
//将列族添加到表中
tblDesc.addFamily(clmDesc);
}
//执行建表
admin.createTable(tblDesc);
System.out.println("创建表" + tableName + "成功!");
}
//关闭表管理
admin.close();
//关闭连接
conn.close();
}
2、插入数据
创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来 提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。
/**
* 向表中插入数据
* @param tableName
* @param rowKey
* @param family
* @param qualifier
* @param value
* @throws IOException
*/
public static void insertData2Tbl(String tableName,String rowKey,String family,String qualifier,String value) throws IOException{
//建立连接
Connection conn = ConnectionFactory.createConnection(conf);
//建立表连接
Table tbl=conn.getTable(TableName.valueOf(tableName));
//用行键实例化Put
Put put=new Put(rowKey.getBytes());
//指定列族名、列名和值
put.addColumn(family.getBytes(), qualifier.getBytes(), value.getBytes());
//执行put
tbl.put(put);
//关闭表
tbl.close();
//关闭连接
conn.close();
}
3、获取数据
要获取数据,使用Get对 象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来 调用。
/**
* 从表中取值
* @param tableName 表名
* @param rowKey 行键
* @param family 列族
* @param qualifier 列
* @return
* @throws IOException
*/
public static String readData4Tbl(String tableName,String rowKey,String family,String qualifier) throws IOException{
//建立连接
Connection conn = ConnectionFactory.createConnection(conf);
//建立表连接
Table tbl=conn.getTable(TableName.valueOf(tableName));
//用行键实例化Get
Get get=new Get(rowKey.getBytes());
//增加列族名和列名条件
get.addColumn(family.getBytes(),qualifier.getBytes() );
//执行,返回结果
Result result=tbl.get(get);
//取出结果
String valStr=Bytes.toString(result.getValue(family.getBytes(), qualifier.getBytes()));
//关闭表
tbl.close();
//关闭连接
conn.close();
return valStr;
}
4、扫描
通过Scan可以对表中的行键范围进行浏览,得到每一行的信息,比如列名,时间戳等,Scan 相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan) 来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan) 都是返回一个Result。 Result是一个KeyValue的链表。
/**
* 扫描行键范围取值
* @param tableName 表名
* @param startRow 起始行键
* @param stopRow 结束行键
* @param family 列族
* @param qualifier 列
* @throws IOException
*/
public static void scanRowRange4Tbl(String tableName,String startRow,String stopRow,String family,String qualifier) throws IOException{
//建立连接
Connection conn = ConnectionFactory.createConnection(conf);
//建立表连接
Table tbl=conn.getTable(TableName.valueOf(tableName));
//初始化Scan实例
Scan scan=new Scan();
//指定开始行键
scan.setStartRow(startRow.getBytes());
//指定结束行键
scan.setStopRow(stopRow.getBytes());
//增加过滤条件
scan.addColumn(family.getBytes(), qualifier.getBytes());
//返回结果
ResultScanner rss=tbl.getScanner(scan);
//迭代并取出结果
for(Result rs:rss){
String valStr=Bytes.toString(rs.getValue(family.getBytes(), qualifier.getBytes()));
System.out.println(valStr);
}
//关闭表
tbl.close();
//关闭连接
conn.close();
}
5、删除
使用Delete来 删除记录,通过调用HTable.delete(Delete)来 执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)
/**
* 删除行键
* @param tableName
* @param rowKey
* @throws IOException
*/
public static void delRowKey4Tbl(String tableName, String rowKey) throws IOException {
// 建立连接
Connection conn = ConnectionFactory.createConnection(conf);
// 建立表连接
Table tbl = conn.getTable(TableName.valueOf(tableName));
// 用行键来实例化Delete实例
Delete del = new Delete(rowKey.getBytes());
// 执行删除
tbl.delete(del);
// 关闭表
tbl.close();
// 关闭连接
conn.close();
}
/**
* 删除单元格(即列)
* @param tableName
* @param rowKey
* @param family
* @param qualifier
* @throws IOException
*/
public static void delCell4Tbl(String tableName, String rowKey, String family, String qualifier) throws IOException {
// 建立连接
Connection conn = ConnectionFactory.createConnection(conf);
// 建立表连接
Table tbl = conn.getTable(TableName.valueOf(tableName));
// 用行键来实例化Delete实例
Delete del = new Delete(rowKey.getBytes());
// 增加过滤条件
del.addColumn(family.getBytes(), qualifier.getBytes());
// 执行删除
tbl.delete(del);
// 关闭表
tbl.close();
// 关闭连接
conn.close();
}
6、锁
7、新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。
8、簇(cluster)的访问
客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeper quorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。
三、Hbase的高级API
HBase高级API主要分为三类:过滤器、计数器和协处理器。
1、过滤器
在设置Scal、Get的时候有一个setFilter(filter),可以在查询时添加更多的限制条件,如正则匹配、根据列值进行匹配等。HBase内置了一些常用过滤器,用户也可以通过实现Filter接口,编写自己的过滤器。
过滤器是服务器端的操作。它在客户端被创建,通过RPC传送到服务器端,然后在服务器端进行过滤操作。
HBase内置常用过滤器如下:
行过滤器(RowFilter):基于行键过滤数据。
Filter filter=new RowFilter(CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row-100")));
前缀过滤器(PrefixFilter):所有与前缀匹配的行都会返回给客户端。
Filter filter=new PrefixFilter(Bytes.toBytes("1990"));
首次行键过滤器(FirstKeyOnlyFilter):在找到所有行第一列的值时,就会返回数据。
Filter filter=new FirstKeyOnlyFilter();
单列值过滤器(SingleColumnValueFilter):根据某列的值进行过滤。
Filter filter=new SingleColumnValueFilter(Bytes.toBytes("cf"),Bytes.toBytes("qual"),CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("value-100")));
2、计数器
由于HBase没有二级索引,故统计功能相对较弱。为应对此种情况,HBase使用计数器(counter)用于实时统计的业务场景下。
计数器实际时HBase表中某一列的值,当进行写操作时,使用Table类的API对该列加1即可。计数器有两种:单计数据器和多计数器。
单计数据器:用户自己设定计数器的行、列族和列。
// 建立表连接
Table tbl = conn.getTable(TableName.valueOf(tableName));
// 计数器增加1
long a=tbl.incrementColumnValue(
Bytes.toBytes("row-count"),
Bytes.toBytes("info"),
Bytes.toBytes("q1"), 1);//比0大,则按给定值增加计数器的数值,若比0小,则按值减少计数器中的值
// 返回计数器当前值
long b=tbl.incrementColumnValue(
Bytes.toBytes("row-count"),
Bytes.toBytes("info"),
Bytes.toBytes("q1"), 0);//0表示返回当前计数器的值
多计数器:允许用户同时更新多个计数器的值,但这些计数器的值都必须处于同一行。
//用行键初始化计数器
Increment increment=new Increment(Bytes.toBytes("row-count"));
//添加多个列
increment.addColumn(Bytes.toBytes("info"), Bytes.toBytes("q2"), 1);
increment.addColumn(Bytes.toBytes("info"), Bytes.toBytes("q3"), 1);
Result result=tbl.increment(increment);
// 打印计数器返回的结果
for(KeyValue kv:result.raw()){
System.out.println("KV:"+kv+" Value:"+Bytes.toLong(kv.getValue()));
}
3、协处理器
协处理器(coprocessor)允许用户在RegionServer上运行自己的代码。协处理器框架主要有Observer和Endpoint两大类,用户可以继承这些类实现自己的逻辑。
Observer:类似于RDMS的触发器,可以重写一些在特定事件发生时执行的回调函数。RegionObserver、MasterObserver和WALObserver三种。RegionObserver可以被用来处理数据修改事件,它发生的地点是Region;MasterObserver可以被用来管理表,如新定义表;WALObserver提供了控制WAL的回调函数。
示例:Observer实现二级索引
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.util.Bytes;
public class TestCoprocessor extends BaseRegionObserver {
@Override
public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability)throws IOException {
Configuration conf=new Configuration();
Connection conn=ConnectionFactory.createConnection(conf);
//索引表
Table tbl=conn.getTable(TableName.valueOf("idx_tbl"));
//取出要插入的数据
List<Cell> cells=put.get("cf".getBytes(), "info".getBytes());
Iterator<Cell> kvIt=cells.iterator();
while(kvIt.hasNext()){
Cell tmp=kvIt.next();
//用值作为行键
Put idxPut=new Put(tmp.getValue());
idxPut.add("cf".getBytes(),tmp.getRow(),Bytes.toBytes(System.currentTimeMillis()));
//插入索引表
tbl.put(idxPut);
}
tbl.close();
conn.close();
}
}
hbase之认识的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Hbase的伪分布式安装
Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- Spark读写Hbase的二种方式对比
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...
- 深入学习HBase架构原理
HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...
- hbase协处理器编码实例
Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...
- hbase集群安装与部署
1.相关环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章仅涉及hbase集群的搭建,关于hadoop与zookeeper的相关部 ...
- 从零自学Hadoop(22):HBase协处理器
阅读目录 序 介绍 Observer操作 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...
- Hbase安装和错误
集群规划情况: djt1 active Hmaster djt2 standby Hmaster djt3 HRegionServer 搭建步骤: 第一步:配置conf/regionservers d ...
随机推荐
- 获取上一行记录lag
SELECT EMPLID ,EFFDT ,END_DT ,COMPANY ,DEPTID ,POSITION_NBR ,' ' ,' ' FROM ( SELECT J1.EMPLID ,J1.EF ...
- 设计 mysql的单例模式及完整功能
class MySQLDB{ private $host; private $port; private $username; private $password; private $charset; ...
- c# ASP.NET Core2.2利用中间件支持跨域请求
1.public void Configure(IApplicationBuilder app, IHostingEnvironment env)方法里面 不要加上:app.UseCors(); 2. ...
- 接口自动化测试持续集成--Soapui接口功能测试参数化
按照自动化测试分层实现的原理,每一层的脚本实现都要进行参数化,自动化的目标就是要实现脚本代码与测试数据分离. 当测试数据进行调整的时候不会对脚本的实现带来震荡,从而提高脚本的稳定性与灵活度,降低脚本的 ...
- Unity如何退出游戏
使用 Application.Quit(),但在 editor 模式下使用 Application.Quit()是没用的,要用 EditorApplication.isPlaying = false. ...
- 解决pycharm左侧项目文件名中文字体乱码情况?中文显示口口口口.
解决pycharm左侧项目文件名中文字体乱码情况?中文显示口口口口. 点击file,进入settings 出现 Appearance & Behavior 点击Appearance UI Op ...
- Git抽取版本之间的差异,打包解压
patch.sh文件代码 #!/bin/bash MY_SAVEIFS=$IFS #IFS=$(echo -en "\n\b") IFS=$'\n' build_dir=" ...
- P4174 [NOI2006]最大获利(网络流)
P4174 [NOI2006]最大获利 还是最大权闭合子图的题 对于每个中转站$k$:$link(k,T,P_k)$ 对于每个用户$i$.中转站$A_i,B_i$.贡献$C_i$ $link(S,i, ...
- 【题解】Luogu P4381 [IOI2008]Island
原题传送门 题意:求基环树森林的直径(所有基环树直径之和) 首先,我们要对环上所有点的子树求出它们的直径和最大深度.然后,我们只用考虑在环上至少经过一条边的路径.那么,这种路径在环上一定有起始点和终点 ...
- VMware虚拟机扩展Ubuntu系统磁盘空间
1 首先给虚拟机扩容 虚拟机->设置->硬盘->实用程序->扩展磁盘容量 2 启动Ubuntu系统 2.1 打开终端安装gparted,sudo apt-get install ...