文档章节

HBase编程实例

韩来明
 韩来明
发布于 2014/08/23 21:29
字数 929
阅读 2108
收藏 14

摘要:在前文中安装了Hbase,通过Hbase shell可以进行一些操作,但是和实际的编程实例联系起来不方便,因此本文介绍有关Hbase编程的实例。

 

一、使用Eclipse开发HBase应用程序

1,在Eclipse中新建一个Java Project,命名为HBaseTest,然后右键Properties中选择Java Build Path,选择Add External Jars,将HBase/lib目录下的jar包导入进来。

2,在工程根目录下创建Conf文件夹,将HBase/Conf下的hbase-site.xml文件复制到该文件夹中,通过右键选择Properties->Java BuildPath->Libraries->Add Class Folder,然后选择Conf文件夹即可。

 

二、简要介绍HBaseJava API

1,  HbaseConfiguration

关系:org.apache.hadoop.hbase.HBaseConfiguration

作用:通过此类可以对HBase进行配置

      

2,  HBaseAdmin

         关系:org.apache.hadoop.hbase.client.HBaseAdmin

         作用:提供一个接口来管理HBase数据库中的表信息。它提供创建表、删除表等方法。

 

3,  HTableDescriptor

         关系:org.apache.hadoop.hbase.client.HTableDescriptor

          作用:包含了表的名字及其对应列族。 提供的方法有

        void          addFamily(HColumnDescriptor)          添加一个列族

        HColumnDescriptor   removeFamily(byte[] column)      移除一个列族

        byte[]              getName()                     获取表的名字

        byte[]              getValue(byte[] key)              获取属性的值

        void                setValue(String key,Stringvalue)    设置属性的值

 

4,  HColumnDescriptor

        关系:org.apache.hadoop.hbase.client.HColumnDescriptor

        作用:维护关于列的信息。提供的方法有

        byte[]              getName()                   获取列族的名字

        byte[]              getValue()                获取对应的属性的值

        void              setValue(String key,String value)设置对应属性的值

 

5,  HTable

        关系:org.apache.hadoop.hbase.client.HTable

作用:用户与HBase表进行通信。此方法对于更新操作来说是非线程安全的,如果启动多个线程尝试与单个HTable实例进行通信,那么写缓冲器可能会崩溃。

 

6,  Put

        关系:org.apache.hadoop.hbase.client.Put

        作用:用于对单个行执行添加操作

7,  Get

        关系:org.apache.hadoop.hbase.client.Get

        作用:用于获取单个行的相关信息

8,  Result

        关系:org.apache.hadoop.hbase.client.Result

        作用:存储Get或Scan操作后获取的单行值。

9,  ResultScanner

        关系:Interface

        作用:客户端获取值的接口。

 

三、 HBase Java API简单实例

 

import java.io.IOException;

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.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Get;
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 minglaihan
 */

public class HBaseTest {
	
	static Configuration cfg = HBaseConfiguration.create();
	
	//通过HBaseAdmin HTableDescriptor来创建一个新表
	public static void create(String tableName, String columnFamily) throws Exception{
		HBaseAdmin admin = new HBaseAdmin(cfg);
		if(admin.tableExists(tableName)){
			System.out.println("Table exist");
			System.exit(0);
		}
		else {
			HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
			tableDescriptor.addFamily(new HColumnDescriptor(columnFamily));
			admin.createTable(tableDescriptor);
			System.out.println("Table create success");
		}
	}
	
	//添加一条数据,通过HTable Put为已存在的表添加数据
	public static void put(String tableName,String row,String columnFamily,String column,String data) throws IOException{
		HTable table = new HTable(cfg, tableName);
		Put put = new Put(Bytes.toBytes(row));
		put.add(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(data));
		table.put(put);
		System.out.println("put success");
	}
	
	//获取tableName表里列为row的结果集
	public static void get(String tableName,String row) throws IOException{
		HTable table = new HTable(cfg, tableName);
		Get get = new Get(Bytes.toBytes(row));
		Result result = table.get(get);
		System.out.println("get "+ result);	
	}
	
	//通过HTable Scan来获取tableName表的所有数据信息
	public static void scan (String tableName) throws IOException{
		HTable table = new HTable(cfg, tableName);
		Scan scan = new Scan();
		ResultScanner resultScanner = table.getScanner(scan);
		for(Result s:resultScanner){
			System.out.println("Scan "+ resultScanner);
		}
	}
	
	public static boolean delete(String tableName) throws Exception{
		HBaseAdmin admin = new HBaseAdmin(cfg);
		if(admin.tableExists(tableName)){
			try {
				admin.disableTable(tableName);
				admin.deleteTable(tableName);
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args) {
		String tableName = "hbase_test";
		String columnFamily = "c1";
		
		try {
			HBaseTest.create(tableName, columnFamily);
			HBaseTest.put(tableName, "row1", columnFamily, "column1", "data1");
			HBaseTest.get(tableName, "row1");
			HBaseTest.scan(tableName);
			if(HBaseTest.delete(tableName)==true){
				System.out.println("delete table "+ tableName+"success");
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

 

将Delete的步骤注释掉的运行结果截图:

 



 

四、总结

       HBase与Java API的交互目前表现良好,在今后的hadoop编程中,可以根据HBase的情况适当利用,提高整体水平。


转载请注明出处: http://www.ming-yue.cn/hbase-program-examples/


© 著作权归作者所有

韩来明
粉丝 2
博文 9
码字总数 9242
作品 0
成都
私信 提问
Hbase访问方式之Hbase shell

Hbase的访问方式 1、Native Java API:最常规和高效的访问方式; 2、HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用; 3、Thrift Gateway:利用Thrift序列化技术,支持C...

dragon_tech
03/06
34
0
阿里云HBase安全系列-初体验

概述简介 阿里云HBase安全包括多方面的措施,主要构成部分有:网络隔离,白名单,身份认证,权限控制,数据加密等,具体介绍可参考文章底部链接。本文主要是阿里云HBase安全实战体验篇,介绍...

HBase技术社区
2018/04/13
0
0
剖析HBase负载均衡和性能指标

1.概述   在分布式系统中,负载均衡是一个非常重要的功能,在HBase中通过Region的数量来实现负载均衡,HBase中可以通过hbase.master.loadbalancer.class来实现自定义负载均衡算法。下面将为...

smartloli
2018/07/01
0
0
Hive学习总结之五:HBase和Hive的集成

Hive和Hbase有各自不同的特征:hive是高延迟、结构化和面向分析的,hbase是低延迟、非结构化和面向编程的。Hive数据仓库在hadoop上是高延迟的。Hive集成Hbase就是为了使用hbase的一些特性。如...

酷帅CoolBash
2013/03/10
9.8K
0
阿里云EMR异步构建云HBase二级索引

一、非HA EMR构建二级索引 云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?spm=a2c4e.11153940.blogrightarea544746.26.6...

shining0227
2018/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部