java链接Hive与Impala经验总结

首先我是使用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

其他基本都差不多,以上是我在学习的时候一点点总结





猜你喜欢

转载自blog.csdn.net/lwb314/article/details/46739067