首先我是使用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
其他基本都差不多,以上是我在学习的时候一点点总结