首先我是使用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的服务端口配置为
那么可以得出结论JDBD链接hive其实是访问的hive的thrift服务,端口为10000
而Impala链接的是
其他基本都差不多,以上是我在学习的时候一点点总结