Hbase Java API详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

HBase是Hadoop的数据库,能够对大数据提供随机、实时读写访问。他是开源的,分布式的,多版本的,面向列的,存储模型。

在讲解的时候我首先给大家讲解一下HBase的整体结构,如下图:

HBase Java API详解

HBase Master是服务器负责管理所有的HRegion服务器,HBase Master并不存储HBase服务器的任何数据,HBase逻辑上的表可能会划分为多个HRegion,然后存储在HRegion Server群中,HBase Master Server中存储的是从数据到HRegion Server的映射。

一台机器只能运行一个HRegion服务器,数据的操作会记录在Hlog中,在读取数据时候,HRegion会先访问Hmemcache缓存,如果 缓存中没有数据才回到Hstore中上找,没一个列都会有一个Hstore集合,每个Hstore集合包含了很多具体的HstoreFile文件,这些文 件是B树结构的,方便快速读取。

 

再看下HBase数据物理视图如下:

Row KeyTimestampColumn Family
URIParser
r1t3url=http://www.taobao.comtitle=天天特价
t2host=taobao.com
t1

r2t5url=http://www.alibaba.comcontent=每天…
t4host=alibaba.com

Ø  Row Key: 行键,Table的主键,Table中的记录按照Row Key排序

Ø  Timestamp: 时间戳,每次数据操作对应的时间戳,可以看作是数据的version number

Ø  Column Family:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。


了解了HBase的体系结构和HBase数据视图够,现在让我们一起看看怎样通过Java来操作HBase数据吧!

先说说具体的API先,如下

 

HBaseConfiguration是每一个hbase client都会使用到的对象,它代表的是HBase配置信息。它有两种构造方式:

public HBaseConfiguration()

public HBaseConfiguration(final Configuration c)

默认的构造方式会尝试从hbase-default.xml和hbase-site.xml中读取配置。如果classpath没有这两个文件,就需要你自己设置配置。

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”, “zkServer”);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, “2181″);

HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

 

创建表

创建表是通过HBaseAdmin对象来操作的。HBaseAdmin负责表的META信息处理。HBaseAdmin提供了createTable这个方法:

public void createTable(HTableDescriptor desc)

HTableDescriptor 代表的是表的schema, 提供的方法中比较有用的有

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

 

增加family通过 addFamily方法

public void addFamily(final HColumnDescriptor family)

HColumnDescriptor 代表的是column的schema,提供的方法比较常用的有

setTimeToLive:指定最大的TTL,单位是ms,过期数据会被自动删除

setInMemory:指定是否放在内存中,对小表有用,可用于提高效率。默认关闭

setBloomFilter:指定是否使用BloomFilter,可提高随机查询效率。默认关闭

setCompressionType:设定数据压缩类型。默认无压缩。

setMaxVersions:指定数据最大保存的版本个数。默认为3。

 

一个简单的例子,创建了4个family的表:

 

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

HTableDescriptor t = new HTableDescriptor(tableName);

t.addFamily(new HColumnDescriptor(“f1″));

t.addFamily(new HColumnDescriptor(“f2″));

t.addFamily(new HColumnDescriptor(“f3″));

t.addFamily(new HColumnDescriptor(“f4″));

hAdmin.createTable(t);

 

删除表

删除表也是通过HBaseAdmin来操作,删除表之前首先要disable表。这是一个非常耗时的操作,所以不建议频繁删除表。

disableTable和deleteTable分别用来disable和delete表。

Example:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

if (hAdmin.tableExists(tableName)) {

       hAdmin.disableTable(tableName);

       hAdmin.deleteTable(tableName);

}

 

查询数据

查询分为单条随机查询和批量查询。

单条查询是通过rowkey在table中查询某一行的数据。HTable提供了get方法来完成单条查询。

批量查询是通过制定一段rowkey的范围来查询。HTable提供了个getScanner方法来完成批量查询。

public Result get(final Get get)

public ResultScanner getScanner(final Scan scan)

Get对象包含了一个Get查询需要的信息。它的构造方法有两种:

  public Get(byte [] row)

  public Get(byte [] row, RowLock rowLock)

Rowlock是为了保证读写的原子性,你可以传递一个已经存在Rowlock,否则HBase会自动生成一个新的rowlock。

Scan对象提供了默认构造函数,一般使用默认构造函数。

 

Get/Scan的常用方法有:

addFamily/addColumn:指定需要的family或者column,如果没有调用任何addFamily或者Column,会返回所有的columns.

setMaxVersions:指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本。

setTimeRange:指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取。

setTimeStamp:指定时间戳。

setFilter:指定Filter来过滤掉不需要的信息

 

Scan特有的方法:

setStartRow:指定开始的行。如果不调用,则从表头开始。

setStopRow:指定结束的行(不含此行)。

setBatch:指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。

ResultScanner是Result的一个容器,每次调用ResultScanner的next方法,会返回Result.

public Result next() throws IOException;

public Result [] next(int nbRows) throws IOException;

 

Result代表是一行的数据。常用方法有:

getRow:返回rowkey

raw:返回所有的key value数组。

getValue:按照column来获取cell的值

 

Example:

Scan s = new Scan();

s.setMaxVersions();

ResultScanner ss = table.getScanner(s);

for(Result r:ss){

    System.out.println(new String(r.getRow()));

    for(KeyValue kv:r.raw()){

       System.out.println(new String(kv.getColumn()));

    }

}

 

插入数据

HTable通过put方法来插入数据。 

public void put(final Put put) throws IOException

public void put(final List puts) throws IOException

可以传递单个批Put对象或者List put对象来分别实现单条插入和批量插入。

Put提供了3种构造方式:

public Put(byte [] row)

public Put(byte [] row, RowLock rowLock)

public Put(Put putToCopy) 

 

Put常用的方法有:

add:增加一个Cell

setTimeStamp:指定所有cell默认的timestamp,如果一个Cell没有指定timestamp,就会用到这个值。如果没有调用,HBase会将当前时间作为未指定timestamp的cell的timestamp.

setWriteToWAL: WAL是Write Ahead Log的缩写,指的是HBase在插入操作前是否写Log。默认是打开,关掉会提高性能,但是如果系统出现故障(负责插入的Region Server挂掉),数据可能会丢失。

另外HTable也有两个方法也会影响插入的性能

setAutoFlash: AutoFlush指的是在每次调用HBase的Put操作,是否提交到HBase Server。默认是true,每次会提交。如果此时是单条插入,就会有更多的IO,从而降低性能.

setWriteBufferSize: Write Buffer Size在AutoFlush为false的时候起作用,默认是2MB,也就是当插入数据超过2MB,就会自动提交到Server

 

Example:

HTable table = new HTable(hbaseConfig, tableName);

table.setAutoFlush(autoFlush);

List lp = new ArrayList();

int count = 10000;

byte[] buffer = new byte[1024];

Random r = new Random();

for (int i = 1; i <= count; ++i) {

       Put p = new Put(String.format(“row%09d”,i).getBytes());

       r.nextBytes(buffer);

       p.add(“f1″.getBytes(), null, buffer);

       p.add(“f2″.getBytes(), null, buffer);

       p.add(“f3″.getBytes(), null, buffer);

       p.add(“f4″.getBytes(), null, buffer);

       p.setWriteToWAL(wal);

       lp.add(p);

       if(i%1000==0){

           table.put(lp);

           lp.clear();

       }

    }

 

删除数据

HTable 通过delete方法来删除数据。

  public void delete(final Delete delete) 

 

Delete构造方法有:

public Delete(byte [] row)

public Delete(byte [] row, long timestamp, RowLock rowLock)

public Delete(final Delete d)

Delete常用方法有

deleteFamily/deleteColumns:指定要删除的family或者column的数据。如果不调用任何这样的方法,将会删除整行。

注意:如果某个Cell的timestamp高于当前时间,这个Cell将不会被删除,仍然可以查出来。

 

Example:

HTable table = new HTable(hbaseConfig, “mytest”);

Delete d = new Delete(“row1″.getBytes());

table.delete(d) 

 

切分表

HBaseAdmin提供split方法来将table 进行split.

public void split(final String tableNameOrRegionName)

 

如果提供的tableName,那么会将table所有region进行split ;如果提供的region Name,那么只会split这个region.

由于split是一个异步操作,我们并不能确切的控制region的个数。

 

Example:

public void split(String tableName,int number,int timeout) throws Exception {

    Configuration HBASE_CONFIG = new Configuration();

    HBASE_CONFIG.set(“hbase.zookeeper.quorum”, GlobalConf.ZOOKEEPER_QUORUM);

    HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, GlobalConf.ZOOKEEPER_PORT);

    HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

    HBaseAdmin hAdmin = new HBaseAdmin(cfg);

    HTable hTable = new HTable(cfg,tableName);

    int oldsize = 0;

    t =  System.currentTimeMillis();

    while(true){

       int size = hTable.getRegionsInfo().size();

       logger.info(“the region number=”+size);

       if(size>=number ) break;

       if(size!=oldsize){

           hAdmin.split(hTable.getTableName());

           oldsize = size;

       }       else if(System.currentTimeMillis()-t>timeout){

           break;

       }

       Thread.sleep(1000*10);

    }

}


转载于:https://my.oschina.net/u/569297/blog/188031

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对C#未来的一点感悟

01—C#有前途吗&#xff1f;在国内C#比较冷门&#xff08;相对Python、Java&#xff09;&#xff0c;很多初学者可能都会对C#的未来有忧虑&#xff0c;害怕没有前途&#xff0c;担心找不到好的工作。其实&#xff0c;大可必须这样&#xff0c;就我在上海而言&#xff0c;我之前…

微软第二财季营收达 517 亿美元,净利润同比增长 21%

微软今日发布了 2022 财年第二财季财报&#xff0c;营收为 517.28 亿美元&#xff0c;与去年同期的 430.76 亿美元相比增长 20%。净利润为 187.65 亿美元&#xff0c;与去年同期的 154.63 亿美元相比增长 21%。生产力和业务流程部门的营收为 159.36 亿美元&#xff0c;与去年同…

二值图像--形态学处理3 开操作和闭操作

学习DIP第13天 转载请标明出处&#xff1a;http://blog.csdn.net/tonyshengtan&#xff0c;欢迎大家转载&#xff0c;发现博客被某些论坛转载后&#xff0c;图像无法正常显示&#xff0c;无法正常表达本人观点&#xff0c;对此表示很不满意。。。。。。。。 开篇废话 简单来说所…

Linux查看硬件信息很Easy

往往一到公司盘点或升级服务器硬件时候&#xff0c;需要记录服务器的具体硬件信息&#xff0c;对于Windows下来说&#xff0c;装个鲁大师既可以查看所有硬件信息&#xff0c;但Linux下要想查看这些硬件信息要麻烦的多&#xff0c;下面是我整理的一些命令&#xff0c;再查看Linu…

常见正则表达式

2019独角兽企业重金招聘Python工程师标准>>> ip地址 /^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(…

WPF 实现动态Windows桌面壁纸~

由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。此项目灵感来源于 丑萌气质狗 B站同名 QQ群&#xff1a;560611514 &#xff08;学习Unity3D&#xff09;增加了播放视频。01—代码如下一…

linux c用open打开(创建)一个文件

1、文件描述符 Linux操作系统内核(kernel)利用文件描述符来访问文件,文件描述符大于等于0,是一个用户描述被打开文件的索引值,它指向该文件的相关信息记录表,当文件打开或者创建新文件的时,就会返回一个文件描述符,当读写文件时,也需要使用文件描述符来指定特写文件。…

Natasha 4.0 探索之路系列(三) 基本的动态编译

相关文章Natasha 4.0 探索之路系列(一) 概况Natasha 4.0 探索之路系列(二) 「域」与插件Natasha 的设计动态编译Roslyn 为开发者提供了动态编译的接口&#xff0c;允许我们以 C# 代码来编写 Emit 或 表达式树生成的程序集&#xff0c;但是完成一个编译需要诸多步骤&#xff0c;…

〖Windows〗Linux的Qt程序源码转换至Windows平台运行,编码的解决

在中国大陆&#xff0c;Windows默认的编码是gb2312&#xff0c;而Linux是UTF8&#xff1b; 多数情况下&#xff0c;把Linux上的程序转换至Windows上运行需要进行编码转换才能正常显示&#xff1b; 而其实大可以不必的&#xff0c;同样&#xff0c;文件使用的依然是UTF-8&#x…

使用WebSocket绕过广告屏蔽插件

2019独角兽企业重金招聘Python工程师标准>>> 现在网络上的广告真的是无所不用其极&#xff0c;在网上冲浪&#xff0c;稍不留神&#xff0c;随时随地都会碰上广告&#xff0c;于是广告屏蔽这个需求&#xff0c;就应运而生了。古语云&#xff0c;道高一尺魔高一丈。今…

linux c头文件#include<sys/types.h>和#include<fcntl.h>头文件总结

#include<sys/types.h>的介绍 是Unix/Linux系统的基本系统数据类型的头文件&#xff0c;含有size_t&#xff0c;time_t&#xff0c;pid_t等类型。linux编程中经常用到的头文件。 clock_t 表示系统时间&#xff08;以时钟周期为单位&#xff09;。   dev_t 用于设备号…

vba怎么安装_学VBA,这些最基础的概念一定要知道

说说VBA的那些事儿VBA是什么&#xff1f;很多使用Excel的人经常会看到这三个字母&#xff0c;那么VBA到底是什么呢&#xff1f;长得神似VB的它到底是干什么的&#xff1f;相信很多人都会有这样的问题&#xff0c;今天就和大家说说有关VBA的那些事儿。1 VBA到底是什么VBA的全称&…

你好骚啊......

1 世贤和品如的结婚照是用当年潘粤明和董洁的结婚照PS的......&#xff08;你好骚啊&#xff09;▼2 还挺有耐心的呢...▼3 这是打算铁定要赢了&#xff01;▼4 请打钱&#xff01;▼5 停车场停猫场&#xff1f;▼6 你的养母&#xff1a;粉红豹、跳跳鱼已上线▼7 这是什么…

演示:使用Sniffer统计与分析流量

演示&#xff1a;使用Sniffer统计与分析流量Sniffer是统计与分析网络数据流量的一个很好的选择。因为Sniffer的“混杂”模式会接收到同一个物理网络内的所有数据帧&#xff0c;无论是广播帧还是发送到一个具体地址的数据帧。如果需要Sniffer监听到所处物理网络不同的数据帧&…

CSS3之阴影

CSS3中新增属性-阴影&#xff0c;可以做出很多漂亮的效果。 文字阴影text-shadow text-shadow属性值的顺序&#xff1a; text-shadow: h-shadow v-shadow blur color; 参数分别表示水平阴影位置&#xff0c;垂直阴影位置&#xff0c;模糊半径&#xff0c;阴影颜色。 一个栗子&a…