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

Posted

技术标签:

【中文标题】如何使用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 <yourhbaseshelllcommands.txt>

请参阅我的 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像jdbc一样直接发送hbase shell命令?的主要内容,如果未能解决你的问题,请参考以下文章

jdbc

JDBC简介及JDBC编写步骤及常见API

一颗简单的JDBC栗子

使用【Feign】调用接口

我应该如何使用 jdbc 从 plsql 将 varray 发送到 java? [复制]

使用 java Spark DataFrame 通过 jdbc 访问 Oracle