由于工作需要,现在需要使用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) {
}
}
}
}
参考资料: