您的位置:首页 > 编程语言 > Java开发

java链接Hive与Impala经验总结

2015-07-03 10:54 573 查看
首先我是使用cloudera-manager安装的CDH5.4.1

之后我运行了hive ,hbase shell,impala-shell都是好用的。

接下来我试试用JAVA去访问hive ,impala服务

首先是java链接impala

但是要注意的是,你工程里要有hive的JDBC驱动,我把服务器的这个路径下hive开头的所有包都放到工程里了

/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/jars

接下来是JAVA链接IMPALA的代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ClouderaImpalaJdbcExample {

// here is an example query based on one of the Hue Beeswax sample tables
private static final String SQL_STATEMENT = "SELECT * FROM hbase_table_1";

// set the impalad host
private static final String IMPALAD_HOST = "10.10.92.151";

// port 21050 is the default impalad JDBC port
private static final String IMPALAD_JDBC_PORT = "21050";

private static final String CONNECTION_URL = "jdbc:hive2://" + IMPALAD_HOST + ':' + IMPALAD_JDBC_PORT + "/;auth=noSasl";

private static final String JDBC_DRIVER_NAME = "org.apache.hive.jdbc.HiveDriver";

public static void main(String[] args) {

System.out.println("\n=============================================");
System.out.println("Cloudera Impala JDBC Example");
System.out.println("Using Connection URL: " + CONNECTION_URL);
System.out.println("Running Query: " + SQL_STATEMENT);

Connection con = null;

try {

Class.forName(JDBC_DRIVER_NAME);

con = DriverManager.getConnection(CONNECTION_URL);

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery(SQL_STATEMENT);

System.out.println("\n== Begin Query Results ======================");

// print the results to the console
while (rs.next()) {
// the example query returns one String column
System.out.print(rs.getString("key")+":");
System.out.println(rs.getString("value"));
}

System.out.println("== End Query Results =======================\n\n");

} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (Exception e) {
// swallow
}
}
}
}


网上搜的,换成我自己的服务器IP后是可用的

但是我发现他的链接是jdbc:hive2开头的,这让我产生了疑问,我到底连的是hive还是impala?

然后我在网上搜索java链接hive的程序,发现

网上大多使用了org.apache.hadoop.hive.jdbc.HiveDriver而上边我们使用的是org.apache.hive.jdbc.HiveDriver

这2个类名一样,但是包不一样,我一开始认为这就是连hive跟impala的区别?

最后我发现其实不是org.apache.hadoop.hive.jdbc.HiveDriver应该是hadoop1.X的类。而到了hadoop2.X里好像已经换成org.apache.hive.jdbc.HiveDriver了

于是我又搜了一下最近的链接hive的代码发现确实使用的是org.apache.hive.jdbc.HiveDriver

接下来是代码

package test;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

/**
* 测试hive 的客户端连接
* @author alexxiyang (https://github.com/alexxiyang)
*
*/
public class HiveJdbcCli {

/**
* 注意:hive-server2 引用的driver是 org.apache.hive.* 而 hive-server 是 org.apache.hadoop.hive.*
*/
private static String driverName = "org.apache.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);
}
//hive的默认端口是 10000,如果要修改就修改 hive-site.xml 文件的hive.server2.thrift.port 属性值
//默认用户名hive,默认密码为空
Connection con = DriverManager.getConnection("jdbc:hive2://10.10.92.151:10000/default", "hive", "");

Statement stmt = con.createStatement();
//测试的表名 testhivedrivertable
String tableName = "ccc";

//如果已经存在就删除
// stmt.execute("drop table if exists " + tableName);

//创建这张表
// stmt.execute("create table " + tableName + " (key int, value string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'");
//看下创建是否成功
// String sql = "show tables '" + tableName + "'";
//// System.out.println("Running: " + sql);
// ResultSet res = stmt.executeQuery(sql);
// if (res.next()) {
// System.out.println(res.getString(1));
// }
//
// //看下表结构
// 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));
// }
//
// // 加载数据到表里面
// // NOTE: filepath 是本地文件所在的位置,注意这个本地不是你的电脑!
// // 你得先把这个文件上传到服务器,然后这里的路径是服务器上这个文件的路径
// // NOTE: /data/a.txt
// String filepath = "/data/a.txt";
// sql = "load data local inpath '" + filepath + "' into table " + tableName;
// System.out.println("Running: " + sql);
// stmt.execute(sql);
//
// select * query
String sql = "select * from " + tableName;
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
}
}
}

我只测试了查询,这里也是好用的,那么区别就来了

两个链接都是jdbc:hive2开头的,区别就在于服务的端口,

我进入cloudera-manager的管理页面里,点击hive查看配置发现我链接hive的服务端口配置为

HiveServer2 端口
hive.server2.thrift.port 值是10000

那么可以得出结论JDBD链接hive其实是访问的hive的thrift服务,端口为10000

而Impala链接的是
Impala Daemon HiveServer2 端口
hs2_port 值为21050

其他基本都差不多,以上是我在学习的时候一点点总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息