如何使用Java API操作Hbase

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Java API操作Hbase相关的知识,希望对你有一定的参考价值。

通过对HBase API的使用,下面例子举例了常见对HBase的操作,如下所示:

package net.csdn.jtlyuan;

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.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
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.io.BatchUpdate;

public class HBaseDBDao 

//定义配置对象HBaseConfiguration
static HBaseConfiguration cfg =null;
static 
Configuration configuration = new Configuration();
cfg = new HBaseConfiguration(configuration);


//创建一张表,指定表名,列族
public static void createTable(String tableName,String columnFarily)throws Exception
HBaseAdmin admin = new HBaseAdmin(cfg);
if(admin.tableExists(tableName))
System.out.println(tableName+"不存在!");
System.exit(0);
else
HTableDescriptor  tableDesc = new HTableDescriptor(tableName);
tableDesc.addFamily(new HColumnDescriptor(columnFarily+":"));
System.out.println("创建表成功!");



//添加数据,通过HTable。和BatchUpdate为已经存在的表添加数据data
public static void addData(String tableName,String row,String columnFamily,String column,String data)throws Exception
HTable table = new HTable(cfg,tableName);
BatchUpdate update = new BatchUpdate(row);
update.put(columnFamily+":"+column, data.getBytes());
table.commit(update);
System.out.println("添加成功!");


//显示所有数据,通过HTable Scan类获取已有表的信息
public static void getAllData(String tableName)throws Exception
HTable table = new HTable(cfg,tableName);
Scan scan = new Scan();
ResultScanner rs = table.getScanner(scan);
for(Result r:rs)
for(KeyValue kv:r.raw())
System.out.println(new String(kv.getColumn())+new String(kv.getValue()));




//测试函数
public static void main(String[] args)
try
String tableName = "student";
HBaseDBDao.createTable(tableName, "c1");
HBaseDBDao.addData(tableName, "row1", "c1", "1", "this is row 1 column c1:c1");
HBaseDBDao.getAllData(tableName);
catch(Exception e)
e.printStackTrace();


参考技术A   一般情况下,我们使用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();





显示所有数据的打印输出如下:

  ==================================
行号: 1
时间戳: 1385597699287
列簇: name
列: myname
值: 秦东亮
==================================
行号: 2
时间戳: 1385598393306
列簇: age
列: myage
值: 100
行号: 2
时间戳: 1385597723900
列簇: name
列: myname
值: 三劫散仙

由此,可以看出Hbase的对外的API提供接口,是非常简单易用的。本回答被提问者和网友采纳

如何使用java api像jdbc一样直接发送hbase shell命令?

【中文标题】如何使用java api像jdbc一样直接发送hbase shell命令?【英文标题】:How to use java api to send hbase shell command directly like jdbc? 【发布时间】:2017-01-08 13:08:37 【问题描述】:

如何使用java api直接像jdbc一样发送hbase shell命令

public static void main(String args[]) 
    // get Connection to connect hbase
    Connection conn = ....;
    // hbase shell command
    String cmd = "get 't1','r1'";

    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(cmd);
    while(rs.next()) 
       ...
    

如果没有为此的java api,还有其他方法可以实现目标吗?

【问题讨论】:

如果 Jar 直接在 Hbase 集群的一个节点上执行,您可以使用 Runtime.getRuntime().exec(command) 执行任何 hbase shell 命令。我在需要使用完整批量加载工具的 Java 程序中使用它。如果你愿意,我给你 sn-p 代码。 我在 JRuby 中做过类似的事情(这是编写 Hbase shell 的内容)。否则,肯定有 Hbase java 客户端 API,所以我不确定我是否理解为什么传递原始 shell 命令是个好主意 如果你没问题,请接受“所有者接受”的答案 你研究过Java Hbase API的使用吗? bogotobogo.com/Hadoop/… @cricket007:是的,上面的链接是 java hbase 客户端,这是常见的做法......但用户想要“java api to send hbase shell command directly”,但不是! @郭,您可以使用hbase java客户端,这是一种灵活的正确方式。 【参考方案1】:

请注意,Phoenix 可以执行 jdbc 样式的查询...如果要执行 get 命令,则可以直接使用 Hbase java client api。从 java 通过 shell 执行并不常见。

如果您仍想从 java prepare 获取或文本文件中的命令列表并使用 RunTime.execute 执行此操作,则可以执行 hbase shell &lt;yourhbaseshelllcommands.txt&gt;

请参阅我的 answer1 或 answer2 来执行此操作。我已经为 spark submit 和 mapreduce 作业做到了。您可以使用与上述相同的方法执行 hbase shell。

实现目标的另一种方式

要以 SQL 方式访问 Hbase,您可以使用 Phoenix。 - https://phoenix.apache.org/faq.html - see this

您也可以使用 Impala 或 hive 检查。

JDBC 客户端驱动:

import java.sql.*;

public class PhoenixExample 

    public static void main(String[] args) 
        // Create variables
        Connection connection = null;
        Statement statement = null;
        ResultSet rs = null;
        PreparedStatement ps = null;

        try 
            // Connect to the database
            connection = DriverManager.getConnection("jdbc:phoenix:localhost");

            // Create a JDBC statement
            statement = connection.createStatement();

            // Execute our statements
            statement.executeUpdate("create table javatest (mykey integer not null primary key, mycolumn varchar)");
            statement.executeUpdate("upsert into javatest values (1,'Hello')");
            statement.executeUpdate("upsert into javatest values (2,'Java Application')");
            connection.commit();

            // Query for table
            ps = connection.prepareStatement("select * from javatest");
            rs = ps.executeQuery();
            System.out.println("Table Values");
            while(rs.next()) 
                Integer myKey = rs.getInt(1);
                String myColumn = rs.getString(2);
                System.out.println("\tRow: " + myKey + " = " + myColumn);
            
        
        catch(SQLException e) 
            e.printStackTrace();
        
        finally 
            if(ps != null) 
                try 
                    ps.close();
                
                catch(Exception e) 
            
            if(rs != null) 
                try 
                    rs.close();
                
                catch(Exception e) 
            
            if(statement != null) 
                try 
                    statement.close();
                
                catch(Exception e) 
            
            if(connection != null) 
                try 
                    connection.close();
                
                catch(Exception e) 
            
        
    

如果你使用的是maven,下面是依赖...

<dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-core</artifactId>
            <version>4.6.0-HBase-1.1</version>
        </dependency>

【讨论】:

这不是假设安装了凤凰服务器吗?问题似乎是想发送 Hbase shell 命令,鉴于 Hbase 客户端已安装和配置,这绝对是可能的。 用户指定他想通过/喜欢 jdbc 访问。这就是我建议 phoenix 的原因。 我想 OP 对 JDBC 通常不发送任意 shell 命令感到困惑。大部分只是 SQL @RamPrasadG 感谢您的回复!但我想直接发送 hbase shell 命令,而不是 SQL @cricket_007 谢谢!你说的对!我想直接发送 hbase shell 命令,而不是 SQL

以上是关于如何使用Java API操作Hbase的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Java API操作Hbase

HBASE基础使用Java API实现DDL与DML

HBase Java 操作 HBase 教程

如何使用java api像jdbc一样直接发送hbase shell命令?

Java 操作 HBase 教程

hbase单机模式下,使用java API远程连接hbase的问题。