Hbase是够建在HDFS之上的半结构化的分布式存储系统,具有HDFS的所有优点,同时也有自己的亮点,支持更快速的随机读写以及更灵活的Scan操作,而在HDFS上这一点我们是远远做不到的,因为HDFS仅支持Append追加操作,而且也不具备随机读写一条数据的功能,实际上HDFS扫描的范围按Block来算的,所以从某个角度来言,Hbase利用Schemal的方式做到了这一点。
一般情况下,我们使用Linux的shell命令,就可以非常轻松的操作Hbase,例如一些建表,建列簇,插值,显示所有表,统计数量等等,但有时为了提高灵活性,我们也需要使用编程语言来操作Hbase,当然Hbase通过Thrift接口提供了对大多数主流编程语言的支持,例如C++,PHP,Python,Ruby等等,那么本篇,散仙给出的例子是基于Java原生的API操作Hbase,相比其他的一些编程语言,使用Java操作Hbase,会更加高效一些,因为Hbase本身就是使用Java语言编写的。
下面,散仙给出源码,以供参考:
- package com.hbase;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.HColumnDescriptor;
- import org.apache.hadoop.hbase.HTableDescriptor;
- import org.apache.hadoop.hbase.KeyValue;
- import org.apache.hadoop.hbase.client.Delete;
- import org.apache.hadoop.hbase.client.Get;
- import org.apache.hadoop.hbase.client.HBaseAdmin;
- import org.apache.hadoop.hbase.client.HTable;
- import org.apache.hadoop.hbase.client.Put;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.util.Bytes;
- /**
- * @author 三劫散仙
- *
- * **/
- public class Test {
- static Configuration conf=null;
- static{
- conf=HBaseConfiguration.create();//hbase的配置信息
- conf.set("hbase.zookeeper.quorum", "10.2.143.5"); //zookeeper的地址
- }
- public static void main(String[] args)throws Exception {
- Test t=new Test();
- //t.createTable("temp", new String[]{"name","age"});
- //t.insertRow("temp", "2", "age", "myage", "100");
- // t.getOneDataByRowKey("temp", "2");
- t.showAll("temp");
- }
- /***
- * 创建一张表
- * 并指定列簇
- * */
- public void createTable(String tableName,String cols[])throws Exception{
- HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类
- if(admin.tableExists(tableName)){
- System.out.println("此表已经存在.......");
- }else{
- HTableDescriptor table=new HTableDescriptor(tableName);
- for(String c:cols){
- HColumnDescriptor col=new HColumnDescriptor(c);//列簇名
- table.addFamily(col);//添加到此表中
- }
- admin.createTable(table);//创建一个表
- admin.close();
- System.out.println("创建表成功!");
- }
- }
- /**
- * 添加数据,
- * 建议使用批量添加
- * @param tableName 表名
- * @param row 行号
- * @param columnFamily 列簇
- * @param column 列
- * @param value 具体的值
- *
- * **/
- public void insertRow(String tableName, String row,
- String columnFamily, String column, String value) throws Exception {
- HTable table = new HTable(conf, tableName);
- Put put = new Put(Bytes.toBytes(row));
- // 参数出分别:列族、列、值
- put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),
- Bytes.toBytes(value));
- table.put(put);
- table.close();//关闭
- System.out.println("插入一条数据成功!");
- }
- /**
- * 删除一条数据
- * @param tableName 表名
- * @param row rowkey
- * **/
- public void deleteByRow(String tableName,String rowkey)throws Exception{
- HTable h=new HTable(conf, tableName);
- Delete d=new Delete(Bytes.toBytes(rowkey));
- h.delete(d);//删除一条数据
- h.close();
- }
- /**
- * 删除多条数据
- * @param tableName 表名
- * @param row rowkey
- * **/
- public void deleteByRow(String tableName,String rowkey[])throws Exception{
- HTable h=new HTable(conf, tableName);
- List<Delete> list=new ArrayList<Delete>();
- for(String k:rowkey){
- Delete d=new Delete(Bytes.toBytes(k));
- list.add(d);
- }
- h.delete(list);//删除
- h.close();//释放资源
- }
- /**
- * 得到一条数据
- *
- * @param tableName 表名
- * @param rowkey 行号
- * ***/
- public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{
- HTable h=new HTable(conf, tableName);
- Get g=new Get(Bytes.toBytes(rowkey));
- Result r=h.get(g);
- for(KeyValue k:r.raw()){
- System.out.println("行号: "+Bytes.toStringBinary(k.getRow()));
- System.out.println("时间戳: "+k.getTimestamp());
- System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));
- System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));
- //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
- // System.out.println("值: "+Bytes.toInt(k.getValue()));
- //}else{
- String ss= Bytes.toString(k.getValue());
- System.out.println("值: "+ss);
- //}
- }
- h.close();
- }
- /**
- * 扫描所有数据或特定数据
- * @param tableName
- * **/
- public void showAll(String tableName)throws Exception{
- HTable h=new HTable(conf, tableName);
- Scan scan=new Scan();
- //扫描特定区间
- //Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号"));
- ResultScanner scanner=h.getScanner(scan);
- for(Result r:scanner){
- System.out.println("==================================");
- for(KeyValue k:r.raw()){
- System.out.println("行号: "+Bytes.toStringBinary(k.getRow()));
- System.out.println("时间戳: "+k.getTimestamp());
- System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));
- System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));
- //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
- // System.out.println("值: "+Bytes.toInt(k.getValue()));
- //}else{
- String ss= Bytes.toString(k.getValue());
- System.out.println("值: "+ss);
- //}
- }
- }
- h.close();
- }
- }
package com.hbase; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; /** * @author 三劫散仙 * * **/ public class Test { static Configuration conf=null; static{ conf=HBaseConfiguration.create();//hbase的配置信息 conf.set("hbase.zookeeper.quorum", "10.2.143.5"); //zookeeper的地址 } public static void main(String[] args)throws Exception { Test t=new Test(); //t.createTable("temp", new String[]{"name","age"}); //t.insertRow("temp", "2", "age", "myage", "100"); // t.getOneDataByRowKey("temp", "2"); t.showAll("temp"); } /*** * 创建一张表 * 并指定列簇 * */ public void createTable(String tableName,String cols[])throws Exception{ HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类 if(admin.tableExists(tableName)){ System.out.println("此表已经存在......."); }else{ HTableDescriptor table=new HTableDescriptor(tableName); for(String c:cols){ HColumnDescriptor col=new HColumnDescriptor(c);//列簇名 table.addFamily(col);//添加到此表中 } admin.createTable(table);//创建一个表 admin.close(); System.out.println("创建表成功!"); } } /** * 添加数据, * 建议使用批量添加 * @param tableName 表名 * @param row 行号 * @param columnFamily 列簇 * @param column 列 * @param value 具体的值 * * **/ public void insertRow(String tableName, String row, String columnFamily, String column, String value) throws Exception { HTable table = new HTable(conf, tableName); Put put = new Put(Bytes.toBytes(row)); // 参数出分别:列族、列、值 put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value)); table.put(put); table.close();//关闭 System.out.println("插入一条数据成功!"); } /** * 删除一条数据 * @param tableName 表名 * @param row rowkey * **/ public void deleteByRow(String tableName,String rowkey)throws Exception{ HTable h=new HTable(conf, tableName); Delete d=new Delete(Bytes.toBytes(rowkey)); h.delete(d);//删除一条数据 h.close(); } /** * 删除多条数据 * @param tableName 表名 * @param row rowkey * **/ public void deleteByRow(String tableName,String rowkey[])throws Exception{ HTable h=new HTable(conf, tableName); List<Delete> list=new ArrayList<Delete>(); for(String k:rowkey){ Delete d=new Delete(Bytes.toBytes(k)); list.add(d); } h.delete(list);//删除 h.close();//释放资源 } /** * 得到一条数据 * * @param tableName 表名 * @param rowkey 行号 * ***/ public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{ HTable h=new HTable(conf, tableName); Get g=new Get(Bytes.toBytes(rowkey)); Result r=h.get(g); for(KeyValue k:r.raw()){ System.out.println("行号: "+Bytes.toStringBinary(k.getRow())); System.out.println("时间戳: "+k.getTimestamp()); System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily())); System.out.println("列: "+Bytes.toStringBinary(k.getQualifier())); //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){ // System.out.println("值: "+Bytes.toInt(k.getValue())); //}else{ String ss= Bytes.toString(k.getValue()); System.out.println("值: "+ss); //} } h.close(); } /** * 扫描所有数据或特定数据 * @param tableName * **/ public void showAll(String tableName)throws Exception{ HTable h=new HTable(conf, tableName); Scan scan=new Scan(); //扫描特定区间 //Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号")); ResultScanner scanner=h.getScanner(scan); for(Result r:scanner){ System.out.println("=================================="); for(KeyValue k:r.raw()){ System.out.println("行号: "+Bytes.toStringBinary(k.getRow())); System.out.println("时间戳: "+k.getTimestamp()); System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily())); System.out.println("列: "+Bytes.toStringBinary(k.getQualifier())); //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){ // System.out.println("值: "+Bytes.toInt(k.getValue())); //}else{ String ss= Bytes.toString(k.getValue()); System.out.println("值: "+ss); //} } } h.close(); } }
显示所有数据的打印输出如下:
- ==================================
- 行号: 1
- 时间戳: 1385597699287
- 列簇: name
- 列: myname
- 值: 秦东亮
- ==================================
- 行号: 2
- 时间戳: 1385598393306
- 列簇: age
- 列: myage
- 值: 100
- 行号: 2
- 时间戳: 1385597723900
- 列簇: name
- 列: myname
- 值: 三劫散仙
================================== 行号: 1 时间戳: 1385597699287 列簇: name 列: myname 值: 秦东亮 ================================== 行号: 2 时间戳: 1385598393306 列簇: age 列: myage 值: 100 行号: 2 时间戳: 1385597723900 列簇: name 列: myname 值: 三劫散仙
由此,可以看出Hbase的对外的API提供接口,是非常简单易用的
相关推荐
它可以在廉价PC Server上搭建起大规模结构化存储集群,提供了一个很好的解决方案 для超大规模和高并发的海量数据实时响应系统。 关键技术点: 1. NoSQL技术:NoSQL是非关系型数据库,不需要固定表结构,可以...
【HBase】HBase是一个分布式的、面向列的非关系型数据库(NoSQL),它建立在HDFS之上,提供了随机读写能力。HBase适用于处理半结构化或非结构化数据,特别适合需要高速随机读写的场景,例如实时数据分析。 【Hadoop...
HBase是构建在Hadoop HDFS之上的NoSQL数据库,设计目标是处理海量数据的同时提供高并发的实时读写能力。 首先,我们需要了解HBase的基本概念。HBase是一个高度可扩展的列式数据库,它借鉴了Google的Bigtable设计,...
HBase则是在Hadoop之上的一个分布式、列族式的NoSQL数据库,它支持实时读写,特别适合处理大规模半结构化或非结构化数据。 首先,让我们深入了解HDFS。HDFS设计的目标是处理PB级别的数据,通过将大文件分割成块并在...
它运行在Hadoop之上,提供实时读写访问,适合于半结构化数据的存储。在分布式网盘系统中,HBase可以用于存储用户文件元数据,如文件名、大小、创建时间、修改时间等,支持快速检索和访问。 **Spring Boot** 是Java...
Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。 当您需要对大数据进行... 正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似Bigtable的功能。
HBase是基于HDFS的分布式NoSQL数据库,它为非结构化和半结构化数据提供了列式存储。HBase适合实时查询,尤其适用于需要随机读取大量数据的场景。将Oracle或MySQL中的数据导入HBase,可以支持快速的实时查询,同时...
Hadoop主要负责大规模数据的分布式存储和计算,而HBase则是构建在Hadoop之上的分布式列式数据库,适合实时查询和大数据分析。本主题将详细讲解如何将HDFS(Hadoop Distributed File System)上的文件导入到HBase中,...
而HBase,则是建立在HDFS之上,面向列的、分布式数据库,特别适合处理海量结构化和半结构化数据。 标题"基于HDFS与HBase的对象存储服务"提示我们,这个压缩包可能包含关于如何利用这两个技术构建和管理对象存储系统...
在当今信息技术高速发展的背景下,分布式文件系统作为处理大规模数据存储和检索的重要技术,已经成为存储领域的核心技术之一。分布式文件系统允许多个客户端并发访问存储在同一物理或虚拟存储资源中的数据,它能够在...
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。与FUJITSU Cliq等商用大数据产品不同,HBase是Google Bigtable...
HBase是一个分布式、面向列的开源数据库,它运行在Hadoop的文件系统(HDFS)之上,利用Hadoop的MapReduce来处理HBase中的大数据,同时也使用Apache ZooKeeper作为分布式协同服务。HBase特别适合于需要快速读写访问...
HBase,是构建在Hadoop之上的NoSQL数据库,设计用于非结构化和半结构化数据的存储。它是一个高度可扩展的列式存储系统,适用于实时读写操作。HBase提供了行式数据模型,每个表由行和列族组成,列族下可以有任意多的...
Apache HBase™是Hadoop数据库,这是一个分布式,可伸缩的大数据存储。当您需要对大数据进行...正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似于Bigtable的功能。
### 分布式存储在网盘和在线备份的应用研究 #### 一、互联网存储应用的特点 在互联网时代,数据存储成为了连接各个应用场景的关键环节之一。针对网盘和在线备份这类应用场景,分布式存储技术提供了高可靠、高可用...
HBase,全称为Apache HBase,是构建在Hadoop文件系统(HDFS)之上的开源、非关系型、分布式数据库。它属于NoSQL数据库的一种,特别适合于处理海量数据,尤其适用于实时读写操作。HBase v1.7.2作为该系统的最新稳定...
HBase是建立在Hadoop文件系统之上的分布式面向列的数据库。它是一个开源项目,是横向扩展的。 HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)...
HBase是基于Hadoop的非关系型分布式数据库(NoSQL),它构建于HDFS之上,支持实时读写,适用于大规模结构化数据的存储。HBase1.2.6版本在性能、稳定性和功能上都有所提升。 伪分布式安装是在单台机器上模拟多节点...
HBase是建立在Hadoop文件系统之上的分布式面向列的数据库。它是一个开源项目,是横向扩展的。 HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)...
HBase是建立在HDFS之上的开源非关系型分布式数据库,具有高可靠性、高性能和良好的可扩展性,适合用于存储大量的结构化数据。HBase采用列式存储方式,可以处理大量动态变化的稀疏数据。它支持海量RDF数据的存储,并...