对于hadoop伪分布式上的hive其他人怎么连接hive

2024-12-11 19:38:38
推荐回答(1个)
回答1:

  • 操作时注意四点

    1. 在连接程序运行前要导入hive文件下面的所有的包

    2. 运行时间可能较长,这是正常的,只要耐心等待

    3. 输入hive --service hiveserver之后,命令框卡住不动是正常情况,如果要使其成为后台程序,只要改输入为 hive --service hiveserver &即可

    4. 真正应用是需要将metadata另外放置在一台机器上,并且导入到mysql中是比较通用的方法。

    一般来说我们对hive的操作都是通过cli来进行,也就是Linux的控制台,但是,这样做本质上是每个连接都存放一个元数据,各个之间都不相同,所以,对于这样的模式我建议是用来做一些测试比较合适,并不适合做产品的开发和应用。

  • 一、环境

    Hadoop 0.20.2版本、Hive-0.5.0版本、JDK1.6

    二、使用目的

    1、一般来说我们对hive的操作都是通过cli来进行,也就是Linux的控制台,但是,这样做本质上是每个连接都存放一个元数据,各个之间都不相同,所以,对于这样的模式我建议是用来做一些测试比较合适,并不适合做产品的开发和应用。

    2、因此,就产生的JDBC连接的方式,当然还有其他的连接方式,比如ODBC等。

    三、连接的配置

    1、修改hive-site.xml

    javax.jdo.option.ConnectionURL

    jdbc:derby:;databaseName=metastore_db;create=true

    表示使用客服模式的derby

    Driver class name for a JDBC metastore

    2、对于嵌入式的derby要求在hive的lib目录下有文件derby.jar,而对于客服模式的derby要求有derbyclient.jar文件,这个文件需要自己去下载。

    3、配置完成之后,输入hive --service hiveserver,可以启动服。

    四、实例代码

    主要是通过JDBC连接Hive的源代码。

    public class HiveJdbcClient {

    private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

    /**

    * @param args

    * @throws SQLException

    */

    public static void main(String[] args) throws SQLException {

    try {

    Class.forName(driverName);

    } catch (ClassNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    System.exit(1);

    }

    Connection con = DriverManager.getConnection("jdbc:hive://IP:10000/default", "", "");

    Statement stmt = con.createStatement();

    String tableName = "http_test";

    // stmt.executeQuery("drop table " + tableName);

    // ResultSet res = stmt.executeQuery("create table " + tableName + " (key int, value string)");

    // show tables

    String sql = "show tables ";

    System.out.println("Running: " + sql);

    ResultSet res = stmt.executeQuery(sql);

    if (res.next()) {

    System.out.println(res.getString(1));

    }

    // describe table

    sql = "describe " + tableName;

    System.out.println("Running: " + sql);

    res = stmt.executeQuery(sql);

    while (res.next()) {

    System.out.println(res.getString(1) + "\t" + res.getString(2));

    }

    // load data into table

    // NOTE: filepath has to be local to the hive server

    // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line

    /**

    * String filepath = "/tmp/a.txt"; sql = "load data local inpath '" + filepath + "' into table " + tableName;

    * System.out.println("Running: " + sql); res = stmt.executeQuery(sql);

    *

    * // select * query sql = "select * from " + tableName; System.out.println("Running: " + sql); res =

    * stmt.executeQuery(sql); while (res.next()) { System.out.println(String.valueOf(res.getInt(1)) + "\t" +

    * res.getString(2)); }

    *

    * // regular hive query sql = "select count(1) from " + tableName; System.out.println("Running: " + sql); res =

    * stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1)); }

    */

    }

    }