impala实现HBase数据查询

由于工作需要,现在需要使用Cloudera Manager的Impala实现大批量数据的查询统计功能。

于是,在前面使用Hbase和solr搭建的平台完成最高院的全文检索平台,继续在clouderaManager原有的hadoop平台基础上继续进行更深层次的研究和应用。

基于某些地方法院对于数据的要求不一致,有的客户针对于法律文书的全文检索,有的客户针对于当前某种类型案件的统计,

因此原有的Hbase+HDFS+Solr+zookeeper的全文检索平台,对于统计查询遇到相应的瓶颈,统计不准确,客户无法得到准确的统计数据。

在这个需求的基础上,利用ClouderaManager平台的Impala服务组件,完成对与大批量数据的实时查询功能。

1、对于原有的数据结构进行拆分,拆分成为关系型数据表。

开始使用sqoop将sqlserver数据导入到hbase,但是遇到问题,由于SQLServer中的关系型数据表都是中文名称和中文字段,在使用脚本语言导入的时候遇到问题。

因此编程将SQLServer数据导入Hbase。

搭建的平台为C#实现应用端的开发,能够直观的操作,访问SQLServer数据库,底层使用java开发访问hbase,使用restful协议,利用servlet的访问传递参数,将数据存储到hbase。

2、将hbase数据表映射到hive中,在hive中需要创建外表,并且对于hbase中的行健也需要映射到hive中。

cloudera官方创建映射的实例:

CREATE EXTERNAL TABLE hbasestringids (
  id string,
  bool_col boolean,
  tinyint_col tinyint,
  smallint_col smallint,
  int_col int,
  bigint_col bigint,
  float_col float,
  double_col double,
  date_string_col string,
  string_col string,
  timestamp_col timestamp)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
  "hbase.columns.mapping" =
  ":key,bools:bool_col,ints:tinyint_col,ints:smallint_col,ints:int_col,ints:\
  bigint_col,floats:float_col,floats:double_col,strings:date_string_col,\
  strings:string_col,strings:timestamp_col"
)
TBLPROPERTIES("hbase.table.name" = "hbasealltypessmall");
3、将hive的表同步到impala中,使用命令INVALIDATE METADATA;

在ssh中输入impala-shell命令,进入到impala的操作界面,输入INVALIDATE METADATA;即可同步hive的数据表。

操作命令类似于mysql的数据库操作命令。

4、impala的java编程

由于cdh中已经将hive-jdbc的jar包含到lib中,因此不需要再下载相关的jar包放到impala/lib中了。

新建工程,同时将jar包导入到工程中。需要的jar包


package impala;

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

public class ImpalaJDBC {
  
  private static final String SQL_STATEMENT = "SELECT name,id FROM test limit 10";
  private static final String IMPALAD_HOST = "192.168.1.10";
  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("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("Begin Query Results");
      while (rs.next()) {
        System.out.println(rs.getString(1));
      }
 
      System.out.println("End Query Results");
 
    } catch (SQLException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        con.close();
      } catch (Exception e) {
      }
    }
  }
}
参考资料:
http://www.tuicool.com/articles/uMfUrun
http://shiyanjun.cn/archives/526.html
http://www.cloudera.com/content/cloudera/zh-CN/documentation/core/v5-3-x/topics/impala_jdbc.html

猜你喜欢

转载自blog.csdn.net/justlpf/article/details/80336605