HBase开发

Posted shi_zi_183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase开发相关的知识,希望对你有一定的参考价值。

HBase开发

Java API简介

HBase的Java API包含很多内容,已经比较完善。
1、HBaseConfiguration类
HBaseConfiguration类属于org.apache.hadoop.hbase包,功能是通过添加HBase相关文件对HBase进行配置文件对HBase进行配置。常用的方法
1)

static org.apache.hadoop.conf.Configuration create()

通过读取默认位置(classpath)下的hbase-site.xml文件,得到各配置项的值,填充到产生Configuration的实例中。
2)

public static org.apache.hadoop.conf.Configuration create(org.apache.hadoop.conf.Configuration that)

读取指定的配置对象,并覆盖默认的HBase配置。
获得org.apache.hadoop.conf.Configuration实例后,可以任意修改配置,例如:

		Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.rootdir","hdfs://localhost:9000/hbase");

Connection接口
创建Connection实例

		Configuration conf = HBaseConfiguration.create();
        Connection connection= ConnectionFactory.createConnection(conf);

Connection提供的常用方法有以下几个。
1)

Admin getAdmin() throws IOException;

返回实施管理HBase集群的一个管理员类Admin实例。返回的Admin不保证是线程安全的,应该为每个使用线程创建一个新实例;这是一个轻量级的操作;不建议对返回的Admin进行池或缓存操作。
2)

Table getTable(TableName var1) throws IOException;

返回一个Table实例,该实例不是线程安全的,应该为每个使用线程创建一个新实例。如果表不存在会抛出异常。使用实例后,调用者负责使用Table close()方法及时关闭。
3)

Configuration getConfiguration();

返回一个配置Configuration实例。
4)

boolean isClosed();

返回连接是否关闭
Put类
Put类位于org.apache.hadoop.hbase.client包,主要用来对单元格进行添加数据操作。
1)Put类构造方法。Put类的常用构造方法有以下几个。

public Put(byte[] row)

指定行键row,行键类型为byte[]。

public Put(byte[] row, long ts)

指定行键row和时间戳ts,行键类型为byte[]。

public Put(ByteBuffer row)

指定行键row,行键类型为ByteBuffer。

public Put(ByteBuffer row, long ts)

指定行键row和时间戳ts,行键类型为ByteBuffer。

public Put(byte[] rowArray, int rowOffset, int rowLength)

从字符串rowArray中提取子串作为行键,参数rowOffset和rowLength分别为偏移量和截取长度。

public Put(byte[] rowArray, int rowOffset, int rowLength, long ts)

从字符串rowArray中提取子串作为行键,并指定时间戳ts

public Put(Put putToCopy)

复制构造方法
2)Put类常用方法

方法名方法说明
Put add(Cell kv)添加KeyValue对象
public Put addColumn(byte[] family, byte[] qualifier, byte[] value)把指定的列族、限定符和值添加到Put中
public List<Cell> get(byte[] family, byte[] qualifier)查询指定的列族和限定符所匹配的值,组织成KeyValue类型的List列表返回
public boolean has(byte[] family, byte[] qualifier)是否有指定的列族和限定符
public boolean has(byte[] family, byte[] qualifier, byte[] value)是否含有指定的列族、限定符和值
public boolean has(byte[] family, byte[] qualifier, long ts)是否含有指定的列族、限定符和时间戳
public boolean has(byte[] family, byte[] qualifier, long ts, byte[] value)是否含有指定的列族、限定符、时间戳和值

Get类
Get类位于org.apache.hadoop.hbase.client包,主要用来获取一行数据。
1)Get类构造方法。

public Get(byte[] row)

按指定行键row创建Get对象,行键类型为byte[]。

public Get(Get get)

复制构造方法。
2)Get类常用方法。

方法名方法说明
public Get addFamily(byte[] family)获取指定的列族的所有列
public Get addColumn(byte[] family, byte[] qualifier)获取指定的列族和列限定符所确定的列
public Get setTimeRange(long minStamp, long maxStamp) throws IOException获取指定的时间戳范围的值
public Get setTimeStamp(long timestamp) throws IOException获取指定的时间戳的值
public Get setMaxVersions()把要取出的最大版本数设为用户在列族描述符中可配置的最大版本数
public Get setMaxVersions(int maxVersions) throws IOException把要取出的最大版本数设为maxVersions

Delete类
Delete类位于org.apache.hadoop.hbase.client包,主要用来删除列族或列。
1)Delete类构造方法。

public Delete(byte[] row)

按指定行键row创建Delete对象。

public Delete(byte[] row, long timestamp)

按指定行键row和时间戳timestamp创建Delete对象。

public Delete(byte[] rowArray, int rowOffset, int rowLength)

按指定行键创建Delete对象。

public Delete(byte[] rowArray, int rowOffset, int rowLength, long ts)

按指定行键和时间戳ts创建Delete对象。
2)Delete类常用方法

方法名说明
public Delete addFamily(byte[] family)删除指定列族的所有列、所有版本
public Delete addFamilyVersion(byte[] family, long timestamp)删除指定的列族,且时间戳等于timestamp的版本
public Delete addFamily(byte[] family, long timestamp)删除指定列族,其时间戳小于等于timestamp的版本
public Delete addColumns(byte[] family, byte[] qualifier)删除指定列族和列限定符所确定的列的最新版本
public Delete addColumns(byte[] family, byte[] qualifier, long timestamp)删除由指定列族和列限定符所确定的列,且时间戳等于timestamp的版本
public Delete addColumns(byte[] family, byte[] qualifier)删除由指定列族、列限定符所确定的所有版本
public Delete addColumns(byte[] family, byte[] qualifier, long timestamp)删除由指定列族、列限定符所确定的列,且时间戳小于等于timestamp的版本
public Delete setTimestamp(long timestamp)设置时间戳

Append类
Appand类位于org.apache.hadoop.hbase.client包,主要用在原有单元格值得基础上追加新值。
1)Append类构造方法

public Append(byte[] row)

按指定的行键row创建Append对象

public Append(byte[] rowArray, int rowOffset, int rowLength)

按指定的行键创建Append对象。

public Append(Append a)

复制构造方法。
2)Append类常用方法。

public Append add(byte[] family, byte[] qualifier, byte[] value)

在指定列族和限定符所确定的列追加值value。

public Append add(Cell cell)

在参数cell指定的位置追加值。
Scan类
Scan类属于org.apache.hadoop.hbase.client包,用来限定查询的数据,限定条件有版本号、起始行号、终止行号、列族等。
1)Scan类构造方法

public Scan(byte[] startRow)

创建Scan对象,指定开始行

public Scan(byte[] startRow, byte[] stopRow)

创建Scan对象,指定开始行和结束行

public Scan(byte[] startRow, Filter filter)

创建Scan对象,指定开始行和过滤条件

public Scan(Get get)

创建与get相同规格的Scan对象
2)Scan类常用方法。

方法名说明
public Scan addFamily(byte[] family)指定要查询的列族
public Scan addColumn(byte[] family, byte[] qualifier)指定要查询的列族和列限定符指定的列
public Scan setMaxVersions()指定每一列获取所有版本
public Scan setMaxVersions(int maxVersions)指定每一列的最大版本数
public Scan setTimeStamp(long timestamp) throws IOException查询指定时间戳的值
public Scan setTimeRange(long minStamp, long maxStamp) throws IOException查询指定时间戳范围的值
public Scan setStartRow(byte[] startRow)指定查询的开始行,startRow闭区间
public Scan setStopRow(byte[] stopRow)指定查询的结束行,stopRow开区间

Result类
Result类位于org.apache.hadoop.hbase.client包,主要用来存放Get和Scan操作后的结果,以键值对的形式存放在Map结构中。

方法名说明
public byte[] getValue(byte[] family, byte[] qualifier)返回列族family包含的列限定符qualifier确定的列的最新版本
public Cell getColumnLatestCell(byte[] family, byte[] qualifier)返回列族family和列限定符qualifier确定的列的最新版本
public List<Cell> getColumnCells(byte[] family, byte[] qualifier)返回列族family和列限定符qualifier确定的列的所有单元格
public NavigableMap<byte[], byte[]> getFamilyMap(byte[] family)返回列族family包含的列限定符qualifier和值value组成的<qualifier,value>形式的Map
public boolean containsColumn(byte[] family, byte[] qualifier)判断是否包含由列族和列限定符所确定的列
public boolean containsEmptyColumn(byte[] family, byte[] qualifier)判断是否包含由列族和列限定符所确定的空列

ResultScanner接口
ResultScanner接口位于org.apache.hadoop.hbase.client包,ResultScanner的主要方法

方法名说明
public void close() throws IOException关闭scanner并释放给它的资源
Result next() throws IOException取得下一行的值,返回Result实例
Result[] next(int var1) throws IOException取得nbRows行的值,返回Result数组

Table接口
Table接口位于org.apache.hadoop.hbase.client包,主要用来和HBase表进行交互,可用于从表中获取、插入、删除或扫描数据。
Table实例通过Connection实例的getTable(TableName tableName)方法获得。

方法说明
TableName getName()获取表的全名
public void close() throws IOException释放内部缓冲区中持有或挂起的资源,并将变化的数据更新到Table
void put(Put var1) throws IOException向表中添加值
void put(List<Put> var1) throws IOException将List中的Put成批添加到表中
void delete(Delete var1) throws IOException删除指定的行或单元格
void delete(List<Delete> var1) throws IOException批量删除List中的Delete对象
boolean exists(Get var1) throws IOException返回Get对象指定的列是否存在
Result get(Get var1) throws IOException从指定的行提取单元格数据
Result[] get(List<Get> var1) throws IOException批量处理List中的Get实例
ResultScanner getScanner(byte[] var1) throws IOException获取ResultScanner实例
Result append(Append var1) throws IOException按指定行和列进行追加操作,返回追加后的值
HTableDescriptor getTableDescriptor() throws IOException获取表的HTableDescriptor实例

HColumnDescriptor类
HColumnDescriptor属于org.apache.hadoop.hbase包,其含有列族的详细信息,例如,最大版本数、最小版本数、压缩算法、块大小、生存期、Bloom过滤器等信息。
1)HColumnDescriptor类构造方法。

public HColumnDescriptor(byte[] familyName)

使用familyName创建HColumnDescriptor对象,其他属性使用默认值

public HColumnDescriptor(String familyName)

使用familyName创建HColumnDescriptor对象,其他属性使用默认值

HColumnDescriptor(HColumnDescriptor desc)

复制构造方法
2)HColumnDescriptor类常用方法

方法名说明
public byte[] getName()返回字节数组类型的列族名
public String getNameAsString()返回String类型的列族名
public HColumnDescriptor setMaxVersions(int maxVersions)设置最大版本数
public int getMaxVersions()取得最大版本数
public HColumnDescriptor setMinVersions(int minVersions)设置最小版本数
public int getMinVersions()取得最小版本数

HTableDescriptor类
HTableDescriptor类属于org.apache.hadoop.hbase包
构造方法
HTableDescriptor(TableName name)
其作用是根据给定的表名创建实例

方法说明
public HTableDescriptor addFamily(HColumnDescriptor family)增加列族
public Collection<HColumnDescriptor> getFamilies()以集合的形式返回表中所有的列族
public HColumnDescriptor[] getColumnFamilies()以数组的形式返回表中所有的列族
public HColumnDescriptor getFamily(byte[] column)返回参数column指定的列族
public HTableDescriptor setRegionReplication(int regionReplication)设置region的副本数
public TableName getTableName()返回表名
public HTableDescriptor setValue(String key, String value)设置元数据键值对
public String getValue(String key)返回元数据中键对应的值

Admin接口
Admin接口位于org.apache.hadoop.hbase.client包

方法说明
void addColumn(TableName var1, HColumnDescriptor var2)向一个已存在的表中添加列
void deleteColumn(TableName var1, byte[] var2)从表中删除列
void createTable(HTableDescriptor var1)创建表
void deleteTable(TableName var1)删除表
HTableDescriptor getTableDescriptor(TableName var1)取得指定表的HtableDescriptor
HTableDescriptor[] listTables()列出所有的表
boolean tableExists(TableName var1)检查表是否存在

HBase Java开发过程

下面以一个简单的程序为例,说明HBase Java程序的开发过程
新建Java Project

添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myHbase</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>

</project>

将hbase和hadoop配置文件放入资源目录
进入集群将配置文件夹中的hdfs-site.xml、core-site.xml、hbase-site.xml放入IDEA项目资源目录。

创建log4j.properties配置文件

# priority  :debug<info<warn<error
#you cannot specify every priority with different file for log4j
log4j.rootLogger=stdout,info,debug,warn,error 

#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout 
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/hp/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout 
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/hp/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout 
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log 
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

新建class类
在src/main/java下创建com.example包,并在包下创建一个HBaseTest类。

package com.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

import java.io.IOException;

public class HBaseTest {
    Connection connection=null;
    Admin admin=null;
    public Boolean init(){  //初始化代码,读取配置文件,完成连接,获取Admin对象
        Configuration conf= HBaseConfiguration.create();
        // conf.set("hbase.rootdir","hdfs://localhost:9000/hbase");
        try{
            this.connection= ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        try {
            this.admin=this.connection.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
            try {
                this.connection.close();
            } catch (IOException e1) {
                e1.printStackTrace();
                return false;
            }
        }
        return true;
    }
    
    public void close(){
        if(admin!=null){
            try{
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try{
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args){
        HBaseTest test=new HBaseTest();
        if(! test.init())return;
        try{
            System.out.println(test.admin.tableExists(TableName.IOS开发-OC学习-常用功能代码片段整理

甘道夫Eclipse+Maven搭建HBase开发环境及HBaseDAO代码演示样例

Android开发常用代码片段

HBase的Java代码开发(从Linux集群环境搭建开始)

微信小程序代码片段

技术答疑HBase封装easy-hbase的原理是怎样的