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

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

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提供接口,是非常简单易用的

相关推荐