`

hbase初探之三(小结)

阅读更多

经过几天来的看资料,写代码,终于对这个东东有点眉目了。

package linhon.crud;

import java.util.Date;
import java.util.Map.Entry;
import java.util.NavigableMap;

import org.apache.hadoop.hbase.HBaseConfiguration;
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;

/***
 * test hbase crud operations
 * @author leibnitz
 * @create jan,12,11
 */
public class TestHbaseCrud {
	
	/**
	 * 不存在rowKey则添加;否则代表修改某column(s).这些操作在行级上更新是原子的。
	 * @param tableName
	 * @param rowkey
	 * @param content
	 * @param addTime
	 * @throws Exception
	 */
	public static void add(String tableName,int rowkey,String content,Date addTime) throws Exception{
		HBaseConfiguration hbaseConf = new HBaseConfiguration();
		HTable htable = new HTable(hbaseConf, tableName);
		htable.setAutoFlush(false);
		htable.setWriteBufferSize(1024 * 5);
		
		//add
		byte[] rowKey = Bytes.toBytes(rowkey);
		Put put = new Put(rowKey );
		if(content != null)
			put.add(Bytes.toBytes("info"), Bytes.toBytes("content"), addTime.getTime(),Bytes.toBytes(content));
		if(addTime != null)		//can add more than one column at the same time
			put.add(Bytes.toBytes("info"), Bytes.toBytes("add_time"), addTime.getTime(),Bytes.toBytes(addTime.getTime()));
		
		htable.put(put);
		htable.flushCommits();
		htable.close();		//invoke flushCommits() also	
	}
	
	/**
	 * add a column(member) to specified row
	 * @param tableName
	 * @param rowkey
	 * @param family
	 * @param column
	 * @throws Exception
	 */
	public static void addColumnOnly(String tableName,int rowkey,String family,String column) throws Exception{
		HBaseConfiguration hbaseConf = new HBaseConfiguration();
		HTable htable = new HTable(hbaseConf, tableName);
		htable.setAutoFlush(false);
		htable.setWriteBufferSize(1024 * 5);
		
		//add
		byte[] rowKey = Bytes.toBytes(rowkey);
		Put put = new Put(rowKey );
		put.add(Bytes.toBytes(family), Bytes.toBytes(column),Bytes.toBytes(""));
		
		htable.put(put);
		htable.flushCommits();
		htable.close();		//invoke flushCommits() also	
	}
	
	public static void query(String tblName,int rowKey,String family,String... columns) throws Exception{
		HBaseConfiguration hconf = new HBaseConfiguration();
		HTable htbl = new HTable(hconf,tblName);
		Scan s = new Scan();
		ResultScanner scan = htbl.getScanner(s);	//add a filer param if necessary
		Result rst = null;
		while(( rst = scan.next() ) != null){		//scan by row
			int row = Bytes.toInt(rst.getRow());
			System.out.println("row:" + row );
			for(String col : columns){				//NOTE :可以使用rst.list()显示所有列
				if(col.contains("time") || col.contains("date")){
					System.out.printf("  %s:%2$tF %2$tH:%2$tM:%2$tS  ",
							col,Bytes.toLong(rst.getValue(Bytes.toBytes(family),Bytes.toBytes(col))));
				}else{
					String content = Bytes.toString(rst.getValue(Bytes.toBytes(family), Bytes.toBytes(col)));
					System.out.printf("  %s:%s  " ,col,content);
				}
				
				byte[] key = Bytes.toBytes(rowKey);
				long ts = 1295977940837l;//1294813460620l;//1295977421536l;//1295976774855l;//1295969908063l;//1294813460625l;
				//note:the second column param is family instead of column. 
//				String qualifier = family + KeyValue.COLUMN_FAMILY_DELIMITER + col;
				final Get g = new Get(key);
			    g.addColumn(Bytes.toBytes(family), Bytes.toBytes(col));
			    g.setTimeStamp( ts);	//query by time range.this means time range:[ts,ts+1)
				boolean b = htbl.exists(g);
				System.out.println("  has versions:" + ts + "," + b);
			}
		}
		
		scan.close();
		htbl.close();
		
	}
	
	/**
	 * test retrieve by versions
	 * @param tblName
	 * @param rowKey
	 * @param family
	 * @param maxVersions 由于建表时指定只保留二个版本,所以如果大于2时输出不会有三个版本。
	 * @param columns
	 * @throws Exception
	 */
	public static void queryByMaxVersions(String tblName,int rowKey,String family,int maxVersions,String...columns) throws Exception{
		HBaseConfiguration hconf = new HBaseConfiguration();
		HTable htbl = new HTable(hconf,tblName);
		
		final Get g = new Get(Bytes.toBytes(rowKey));
	    if(columns == null || columns.length == 0)
	    	g.addColumn(Bytes.toBytes(family));
	    else{
	    	for(String col : columns){
	    		g.addColumn(Bytes.toBytes(family), Bytes.toBytes(col));
	    	}
	    }
	    
		g.setMaxVersions(maxVersions);		
		Result rst = htbl.get(g);
//		System.out.println(rst.getMap());
		for(Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry : rst.getMap().entrySet()){
			System.out.println("family: " + Bytes.toString(entry.getKey()));
			for(Entry<byte[],NavigableMap<Long, byte[]>> entry2 : entry.getValue().entrySet()){
				String col = Bytes.toString(entry2.getKey());
				System.out.println("  qualifier: " + col);
				for(Entry<Long, byte[]> entry3 : entry2.getValue().entrySet()){
					if(col.contains("time") || col.contains("date")){
						System.out.println("    version: " + entry3.getKey() + 
								",value:" + Bytes.toLong(entry3.getValue()));
					}else{
						System.out.println("    version: " + entry3.getKey() + 
								",value:" + Bytes.toString(entry3.getValue()));
					}
				}
			}
		}
//		当输出所有columns,并且maxVersions >=2时,output is:
//		family: info
//		  qualifier: add_time
//		    version: 1295977940837,value:1295977940837		已经是倒序输出(比早版本大)
//		    version: 1295977489609,value:1295977488769		此版本小
//		  qualifier: content
//		    version: 1295977940837,value:linhon				同上
//		    version: 1295976774855,value:bye,linhon
		
		htbl.close();
		
	}
		
	//见add()
	public static void modify(){
		
	}
	
	/**
	 * 删除可以根据以下条件进行:
	 * 1.family or family+column 
	 * 2.timestamp range
	 * 3.regexp
	 */
	public static void deleteColumnData(String tblName,int rowKey,String family,String column,long timestamp) throws Exception{
		HBaseConfiguration hconf = new HBaseConfiguration();
		HTable htbl = new HTable(hconf,tblName);
		Delete dlt = new Delete(Bytes.toBytes(rowKey));
		dlt.deleteColumn(Bytes.toBytes(family), Bytes.toBytes(column), timestamp);
		
		htbl.delete(dlt);
		htbl.flushCommits();
		htbl.close();
	}
	/**
	 * delete the column(and data) but family
	 * @param tblName
	 * @param rowKey
	 * @param family
	 * @param column
	 * @param timestamp
	 * @throws Exception
	 */
	public static void deleteColumnFamily(String tblName,String family,String column) throws Exception{
		HBaseConfiguration hconf = new HBaseConfiguration();
		HBaseAdmin admin = new HBaseAdmin(hconf);
		//disable table is a must
		if(admin.isTableEnabled(tblName))
			admin.disableTable(tblName);
		admin.deleteColumn(tblName, family /*+ ":" + column*/);	//columnName参数是任意family,':',qualifier组合的,有没有qualifier均可
		
//		admin.enableTable(tblName);	//this is a artifice(技巧)
		
		admin.flush(tblName);
		
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
//		add("test_user",1,"linhon",new Date());
//		add("test_user",1,"hello,linhon",new Date());
//		add("test_user",1,"bye,linhon",new Date());
//		add("test_user",1,null,new Date());
		
//		add("test_user",1,null,new Date());
		
//		System.out.println(System.currentTimeMillis());
		
//		query("test_user",1,"info",new String[]{"content","add_time"});
		
//		queryByMaxVersions("test_user",1,"info",3,new String[]{"content","add_time"});
//		queryByMaxVersions("test_user",1,"info",3,new String[]{"content"/*,"add_time"*/});
		
//		addColumnOnly("test_user", 1, "info", "age");
//		deleteColumnData("test_user",1,"info","age",1296030610746l);
		
//		deleteColumnFamily("test_user","info","age");
		
		addColumnOnly("test_user2", 1, "num", "age");
//		deleteColumnFamily("test_user2","num","age");	//test table

	}

}




我觉得既然它有横向切分(书上是这样说的,但没有在真正分布式跑过,只在伪分布,所以不是否正确??),非结构化
儲存,支持版本化,那么就不应该只是进行简单的CRUD的普通表似的操作,所以我挖倔一些新功能点出来。
注意问题:
1.旧版本的:exists(final byte [] row, final byte [] column,long timestamp),其中的timestamp代表是从0开始到timestamp
的time range;新版本的exists(Get)可以指定一个具体的timestamp范围而不是使用从0开始的范围。
hbase(main):014:0> scan 'test_user'
ROW                          COLUMN+CELL                                                                      
 \x00\x00\x00\x01            column=info:add_time, timestamp=1294813460625, value=\x00\x00\x01-x\xE5uw        
 \x00\x00\x00\x01            column=info:content, timestamp=1295976774855, value=bye,linhon
 
2.pub或get中的addColumn(column)如果只有一个参数,代表这是old format column,that means the form is:<family:column>
3.Htable是对表数据的修改查询操作;HBaseAdmin是对表结构操作;
4.在shell下进行的scan操作,各cell只输出最后一个version的value
5.添加数据时,row key是必须指定的。
6.在已有数据情况下添加新column,HTable中需要指定一个rowkey,代表只添加到些行上,其它行是没有这列数据的。
7.deleteColumn(tbl,col)使用family+":"+column作为col时删除全部列(family)
8.hbase无法做到动态增加/删除列族(要先disable);删除只能删除列族,不能单独删除column成员


分享到:
评论

相关推荐

    hbase&hadoop初探

    标题中的“hbase&hadoop初探”表明我们将要探讨的是大数据处理领域中的两个关键组件:HBase和Hadoop。这两个技术是Apache软件基金会的重要项目,对于理解和掌握大数据存储与处理有着至关重要的作用。 首先,Hadoop...

    HbaseTemplate 操作hbase

    HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data Hadoop是Spring框架的一部分,它提供了与Hadoop生态系统集成的工具,包括对HBase的操作支持。本篇文章...

    实验三:熟悉常用的HBase操作

    Hadoop版本至少需要2.7.1或更高,这是HBase运行的基础,因为HBase构建在Hadoop的HDFS之上,用于存储数据。HBase版本至少为1.1.2,它提供了一套强大的数据管理特性。JDK版本至少1.7,这是运行HBase和相关Java程序的...

    hbase配置内置的zookeeper

    首先需要准备三个虚拟机,并在其上放置 HBase 和 ZooKeeper 的 tar 包。这些包需要解压,并将解压后的 `hbase-1.3.1` 文件夹重命名为 `hbase`。 ##### 2. 配置环境变量 接下来是配置环境变量,这一步对于确保 ...

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    HBase官方文档中文版-HBase手册中文版

    HBase设计目标是提供大规模数据的实时读写能力,它运行在Hadoop之上,利用HDFS作为其底层存储系统。HBase的数据模型基于稀疏、多维度、排序的映射表,其中行键、列族、列限定符和时间戳构成数据的唯一标识。 二、...

    大数据实验三-HBase编程实践

    #### 三、HBase的Java API 除了Shell命令之外,HBase还提供了丰富的Java API,用于更高级的编程操作。以下是一些关键的Java API概念和使用方法: 1. **创建连接**: - `ConnectionFactory.createConnection...

    Hbase权威指南(HBase: The Definitive Guide)

    #### 三、HBase与Hadoop的集成 - **高度集成**:HBase与Hadoop生态系统紧密结合,充分利用Hadoop提供的资源管理和计算框架。 - **MapReduce集成**:HBase支持MapReduce任务直接对存储在HBase中的数据进行处理,这...

    hbase 权限三种方式.docx

    本文主要介绍了三种HBase的权限管理方式,包括静态数据透明加密、Kerberos认证以及用户权限访问控制。 首先,静态数据透明加密是一种保护存储在HDFS(Hadoop Distributed File System)上的HFile和WAL(Write-Ahead...

    HBase学习利器:HBase实战

    #### 三、HBase核心技术详解 **1. 数据存储模型**:HBase中的数据以表格形式存储,每张表由一个或多个列族组成,每个列族又包含多个列。每个单元格包含一个版本号,可以存储不同时间的数据。 **2. 数据分区与分布*...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...

    HBase开启审计日志

    #### 三、测试审计日志功能 为了验证审计日志功能是否正常工作,可以执行一些基本的HBase命令,例如创建表、插入数据、删除表等操作,并检查审计日志中是否有相应的记录。 - **示例操作**: ```shell hbase(main...

    HBase 2.0 MOB 保存图片小视频利器-upload_HBase2.0MOB_

    在传统的HBase存储模型中,小文件直接存储在HFile中,可能会导致过多的小文件,从而影响性能。MOB特性通过将小对象集中存储,减少了HRegion内的文件数量,提升了读写效率。它将小对象存储在一个称为Mob File的特殊...

    HBase(hbase-2.4.9-bin.tar.gz)

    就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非...

    hadoop,hbase,zookeeper安装笔记

    hadoop,hbase,zookeeper安装笔记hadoop,hbase,zookeeper安装笔记hadoop,hbase,zookeeper安装笔记

    hbase用于查询客户端工具

    HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。HBase以其高吞吐量、低延迟和水平扩展能力而闻名,常用于存储非结构化和半结构化数据。在HBase...

    在windows上安装Hbase

    三、安装HBase 1. 解压下载的压缩包。 2. 在conf/hbase-env.sh文件中添加配置项,例如export JAVA_HOME=/cygdrive/c/Progra~1/Java/jdk1.6.0_18。 四、配置HBase 1. 新建hbase-site.xml文件,内容如下: ``` ...

    hbase-2.4.17-bin 安装包

    5. Indexing:虽然HBase本身不支持索引,但可以通过第三方库如 phoenix 或 hbase-indexer 实现索引功能。 六、监控与维护 1. 使用HBase自带的JMX监控工具或第三方监控工具(如Ambari、Grafana)监控HBase集群的...

    hbase安装与使用

    HBase 是一款构建于 Hadoop 之上的分布式、可扩展的大规模数据存储系统。它提供了类似 Google BigTable 的功能特性,非常适合处理海量数据和高并发读写需求的应用场景。本文主要介绍如何在 Linux 环境下安装和配置 ...

    hbase安装包

    HBase,全称为Hadoop Distributed File System上的基础结构(HBase on Hadoop Distributed File System),是一种分布式的、面向列的开源数据库,它构建在Apache Hadoop文件系统(HDFS)之上,提供高可靠性、高性能...

Global site tag (gtag.js) - Google Analytics