`
weitao1026
  • 浏览: 1054009 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hbase是够建在HDFS之上的半结构化的分布式存储系统,

阅读更多

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语言编写的。

下面,散仙给出源码,以供参考:

Java代码 复制代码 收藏代码
  1. package com.hbase;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.hadoop.conf.Configuration;  
  7. import org.apache.hadoop.hbase.HBaseConfiguration;  
  8. import org.apache.hadoop.hbase.HColumnDescriptor;  
  9. import org.apache.hadoop.hbase.HTableDescriptor;  
  10. import org.apache.hadoop.hbase.KeyValue;  
  11. import org.apache.hadoop.hbase.client.Delete;  
  12. import org.apache.hadoop.hbase.client.Get;  
  13. import org.apache.hadoop.hbase.client.HBaseAdmin;  
  14. import org.apache.hadoop.hbase.client.HTable;  
  15. import org.apache.hadoop.hbase.client.Put;  
  16. import org.apache.hadoop.hbase.client.Result;  
  17. import org.apache.hadoop.hbase.client.ResultScanner;  
  18. import org.apache.hadoop.hbase.client.Scan;  
  19. import org.apache.hadoop.hbase.util.Bytes;  
  20.   
  21. /** 
  22.  * @author 三劫散仙 
  23.  *  
  24.  * **/  
  25. public class Test {  
  26.       
  27.     static Configuration conf=null;  
  28.     static{  
  29.           
  30.           conf=HBaseConfiguration.create();//hbase的配置信息  
  31.           conf.set("hbase.zookeeper.quorum""10.2.143.5");  //zookeeper的地址  
  32.           
  33.     }  
  34.       
  35.     public static void main(String[] args)throws Exception {  
  36.           
  37.         Test t=new Test();  
  38.         //t.createTable("temp", new String[]{"name","age"});  
  39.      //t.insertRow("temp", "2", "age", "myage", "100");  
  40.     // t.getOneDataByRowKey("temp", "2");  
  41.         t.showAll("temp");  
  42.        
  43.     }  
  44.       
  45.     /*** 
  46.      * 创建一张表 
  47.      * 并指定列簇 
  48.      * */  
  49.     public void createTable(String tableName,String cols[])throws Exception{  
  50.      HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类  
  51.     if(admin.tableExists(tableName)){  
  52.         System.out.println("此表已经存在.......");  
  53.     }else{  
  54.         HTableDescriptor table=new HTableDescriptor(tableName);  
  55.         for(String c:cols){  
  56.             HColumnDescriptor col=new HColumnDescriptor(c);//列簇名  
  57.             table.addFamily(col);//添加到此表中  
  58.         }  
  59.           
  60.      admin.createTable(table);//创建一个表  
  61.      admin.close();  
  62.      System.out.println("创建表成功!");  
  63.     }  
  64.     }  
  65.       
  66.     /** 
  67.      * 添加数据, 
  68.      * 建议使用批量添加 
  69.      * @param tableName 表名 
  70.      * @param row  行号 
  71.      * @param columnFamily 列簇 
  72.      * @param column   列 
  73.      * @param value   具体的值 
  74.      *  
  75.      * **/  
  76.     public  void insertRow(String tableName, String row,    
  77.             String columnFamily, String column, String value) throws Exception {    
  78.         HTable table = new HTable(conf, tableName);    
  79.         Put put = new Put(Bytes.toBytes(row));    
  80.         // 参数出分别:列族、列、值    
  81.         put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),    
  82.                 Bytes.toBytes(value));   
  83.          
  84.         table.put(put);    
  85.         table.close();//关闭  
  86.         System.out.println("插入一条数据成功!");  
  87.     }      
  88.       
  89.     /** 
  90.      * 删除一条数据 
  91.      * @param tableName 表名 
  92.      * @param row  rowkey 
  93.      * **/  
  94.     public void deleteByRow(String tableName,String rowkey)throws Exception{  
  95.         HTable h=new HTable(conf, tableName);  
  96.         Delete d=new Delete(Bytes.toBytes(rowkey));  
  97.         h.delete(d);//删除一条数据  
  98.         h.close();  
  99.     }  
  100.       
  101.     /** 
  102.      * 删除多条数据 
  103.      * @param tableName 表名 
  104.      * @param row  rowkey 
  105.      * **/  
  106.     public void deleteByRow(String tableName,String rowkey[])throws Exception{  
  107.         HTable h=new HTable(conf, tableName);  
  108.        
  109.         List<Delete> list=new ArrayList<Delete>();  
  110.         for(String k:rowkey){  
  111.             Delete d=new Delete(Bytes.toBytes(k));  
  112.             list.add(d);  
  113.         }  
  114.         h.delete(list);//删除  
  115.         h.close();//释放资源  
  116.     }  
  117.       
  118.     /** 
  119.      * 得到一条数据 
  120.      *  
  121.      * @param tableName 表名 
  122.      * @param rowkey 行号 
  123.      * ***/  
  124.     public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{  
  125.         HTable h=new HTable(conf, tableName);  
  126.           
  127.         Get g=new Get(Bytes.toBytes(rowkey));  
  128.         Result r=h.get(g);  
  129.         for(KeyValue k:r.raw()){  
  130.               
  131.             System.out.println("行号:  "+Bytes.toStringBinary(k.getRow()));  
  132.             System.out.println("时间戳:  "+k.getTimestamp());  
  133.             System.out.println("列簇:  "+Bytes.toStringBinary(k.getFamily()));  
  134.             System.out.println("列:  "+Bytes.toStringBinary(k.getQualifier()));  
  135.             //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){  
  136.             //  System.out.println("值:  "+Bytes.toInt(k.getValue()));  
  137.             //}else{  
  138.             String ss=  Bytes.toString(k.getValue());  
  139.             System.out.println("值:  "+ss);  
  140.             //}  
  141.               
  142.                
  143.               
  144.         }  
  145.         h.close();  
  146.           
  147.           
  148.     }  
  149.       
  150.     /** 
  151.      * 扫描所有数据或特定数据 
  152.      * @param tableName 
  153.      * **/  
  154.     public void showAll(String tableName)throws Exception{  
  155.           
  156. HTable h=new HTable(conf, tableName);  
  157.           
  158.          Scan scan=new Scan();  
  159.          //扫描特定区间  
  160.          //Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号"));  
  161.          ResultScanner scanner=h.getScanner(scan);  
  162.          for(Result r:scanner){  
  163.              System.out.println("==================================");  
  164.         for(KeyValue k:r.raw()){  
  165.               
  166.             System.out.println("行号:  "+Bytes.toStringBinary(k.getRow()));  
  167.             System.out.println("时间戳:  "+k.getTimestamp());  
  168.             System.out.println("列簇:  "+Bytes.toStringBinary(k.getFamily()));  
  169.             System.out.println("列:  "+Bytes.toStringBinary(k.getQualifier()));  
  170.             //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){  
  171.             //  System.out.println("值:  "+Bytes.toInt(k.getValue()));  
  172.             //}else{  
  173.             String ss=  Bytes.toString(k.getValue());  
  174.             System.out.println("值:  "+ss);  
  175.             //}  
  176.               
  177.                
  178.               
  179.         }  
  180.          }  
  181.         h.close();  
  182.           
  183.     }  
  184.   
  185. }  
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();
    	
    }

}


显示所有数据的打印输出如下:

Java代码 复制代码 收藏代码
  1. ==================================  
  2. 行号:  1  
  3. 时间戳:  1385597699287  
  4. 列簇:  name  
  5. 列:  myname  
  6. 值:  秦东亮  
  7. ==================================  
  8. 行号:  2  
  9. 时间戳:  1385598393306  
  10. 列簇:  age  
  11. 列:  myage  
  12. 值:  100  
  13. 行号:  2  
  14. 时间戳:  1385597723900  
  15. 列簇:  name  
  16. 列:  myname  
  17. 值:  三劫散仙  
==================================
行号:  1
时间戳:  1385597699287
列簇:  name
列:  myname
值:  秦东亮
==================================
行号:  2
时间戳:  1385598393306
列簇:  age
列:  myage
值:  100
行号:  2
时间戳:  1385597723900
列簇:  name
列:  myname
值:  三劫散仙




由此,可以看出Hbase的对外的API提供接口,是非常简单易用的

分享到:
评论

相关推荐

    分布式存储系统HBase关键技术研究.pdf

    它可以在廉价PC Server上搭建起大规模结构化存储集群,提供了一个很好的解决方案 для超大规模和高并发的海量数据实时响应系统。 关键技术点: 1. NoSQL技术:NoSQL是非关系型数据库,不需要固定表结构,可以...

    基于分布式存储系统的Hive与Hbase的研究.pdf

    【HBase】HBase是一个分布式的、面向列的非关系型数据库(NoSQL),它建立在HDFS之上,提供了随机读写能力。HBase适用于处理半结构化或非结构化数据,特别适合需要高速随机读写的场景,例如实时数据分析。 【Hadoop...

    《Hadoop大数据开发实战》教学教案—08HBase分布式存储系统.pdf

    HBase是构建在Hadoop HDFS之上的NoSQL数据库,设计目标是处理海量数据的同时提供高并发的实时读写能力。 首先,我们需要了解HBase的基本概念。HBase是一个高度可扩展的列式数据库,它借鉴了Google的Bigtable设计,...

    大数据 hdfs hadoop hbase jmeter

    HBase则是在Hadoop之上的一个分布式、列族式的NoSQL数据库,它支持实时读写,特别适合处理大规模半结构化或非结构化数据。 首先,让我们深入了解HDFS。HDFS设计的目标是处理PB级别的数据,通过将大文件分割成块并在...

    基于hadoop+hbase+springboot实现分布式网盘系统.zip

    它运行在Hadoop之上,提供实时读写访问,适合于半结构化数据的存储。在分布式网盘系统中,HBase可以用于存储用户文件元数据,如文件名、大小、创建时间、修改时间等,支持快速检索和访问。 **Spring Boot** 是Java...

    Hbase_存储结构.pptx

    Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。 当您需要对大数据进行... 正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似Bigtable的功能。

    hadoop的mapreduce把oracle/mysq导入到hbase和hdfs中的程序

    HBase是基于HDFS的分布式NoSQL数据库,它为非结构化和半结构化数据提供了列式存储。HBase适合实时查询,尤其适用于需要随机读取大量数据的场景。将Oracle或MySQL中的数据导入HBase,可以支持快速的实时查询,同时...

    将hdfs上的文件导入hbase的源代码

    Hadoop主要负责大规模数据的分布式存储和计算,而HBase则是构建在Hadoop之上的分布式列式数据库,适合实时查询和大数据分析。本主题将详细讲解如何将HDFS(Hadoop Distributed File System)上的文件导入到HBase中,...

    基于HDFS与HBase的对象存储服务.zip

    而HBase,则是建立在HDFS之上,面向列的、分布式数据库,特别适合处理海量结构化和半结构化数据。 标题"基于HDFS与HBase的对象存储服务"提示我们,这个压缩包可能包含关于如何利用这两个技术构建和管理对象存储系统...

    开源分布式文件系统

    在当今信息技术高速发展的背景下,分布式文件系统作为处理大规模数据存储和检索的重要技术,已经成为存储领域的核心技术之一。分布式文件系统允许多个客户端并发访问存储在同一物理或虚拟存储资源中的数据,它能够在...

    HBase数据库性能调优

    HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。与FUJITSU Cliq等商用大数据产品不同,HBase是Google Bigtable...

    搭建HBase完全分布式数据库

    HBase是一个分布式、面向列的开源数据库,它运行在Hadoop的文件系统(HDFS)之上,利用Hadoop的MapReduce来处理HBase中的大数据,同时也使用Apache ZooKeeper作为分布式协同服务。HBase特别适合于需要快速读写访问...

    分布式环境下栅格数据存储策略源码(基于Hadoop、HDFS和HBase).zip

    HBase,是构建在Hadoop之上的NoSQL数据库,设计用于非结构化和半结构化数据的存储。它是一个高度可扩展的列式存储系统,适用于实时读写操作。HBase提供了行式数据模型,每个表由行和列族组成,列族下可以有任意多的...

    apache_hbase_reference_guide.pdf

    Apache HBase™是Hadoop数据库,这是一个分布式,可伸缩的大数据存储。当您需要对大数据进行...正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似于Bigtable的功能。

    分布式存储在网盘和在线备份的应用研究

    ### 分布式存储在网盘和在线备份的应用研究 #### 一、互联网存储应用的特点 在互联网时代,数据存储成为了连接各个应用场景的关键环节之一。针对网盘和在线备份这类应用场景,分布式存储技术提供了高可靠、高可用...

    Hbase分布式数据库 v1.7.2.zip

    HBase,全称为Apache HBase,是构建在Hadoop文件系统(HDFS)之上的开源、非关系型、分布式数据库。它属于NoSQL数据库的一种,特别适合于处理海量数据,尤其适用于实时读写操作。HBase v1.7.2作为该系统的最新稳定...

    hbase-1.4.9-bin.tar.gz

    HBase是建立在Hadoop文件系统之上的分布式面向列的数据库。它是一个开源项目,是横向扩展的。 HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)...

    Hadoop2.7.5-HBase1.2.6伪分布式安装

    HBase是基于Hadoop的非关系型分布式数据库(NoSQL),它构建于HDFS之上,支持实时读写,适用于大规模结构化数据的存储。HBase1.2.6版本在性能、稳定性和功能上都有所提升。 伪分布式安装是在单台机器上模拟多节点...

    2-1-HBase.pdf

    HBase是建立在Hadoop文件系统之上的分布式面向列的数据库。它是一个开源项目,是横向扩展的。 HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)...

    海量RDF数据的分布式存储研究.pdf

    HBase是建立在HDFS之上的开源非关系型分布式数据库,具有高可靠性、高性能和良好的可扩展性,适合用于存储大量的结构化数据。HBase采用列式存储方式,可以处理大量动态变化的稀疏数据。它支持海量RDF数据的存储,并...

Global site tag (gtag.js) - Google Analytics