这里先简单介绍下hive,Impala、HBase:
hive:
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive支持HSQL,是一种类SQL。
Impala:
Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟
HBase:
HBase是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
hive、impala最大的好处和共同点就是可以使用sql语句对habse的数据进行操作,这对于我们java开发人员减少了大量的工作量,而不用像专业的大数据运维人员那样去写脚本。
项目是用mybatis来做持久层的,一开始就是想用mybatis来映射impala的查询。再配置好数据源和查询语句后,用junit测试发现sql语句再执行过程中就报错了,再排除数据源、impala驱动、连接字符串及mybatis的配置后发现依旧报错,再经过几天的折腾后问题依旧没有解决,只能暂时放弃采用原生的JDBC去连接impala(因项目比较紧张,只能后面再研究,可能是mybatis暂不支持impala,后面有位同事也遇到同样的问题)
如果有大牛在mybatis上连接impala成功的话请不吝赐教哈!~
配置impala连接池
<bean id="dataSourcePid" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="jdbcUrl" value="jdbc:impala://***"/>
<property name="user" value="" />
<property name="password" value="" />
<property name="driverClass" value="com.cloudera.impala.jdbc41.Driver"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="30"/>
<property name="idleConnectionTestPeriod" value="600"/>
<property name="checkoutTimeout" value="30000"/>
<property name="maxIdleTime" value="600" />
<property name="acquireIncrement" value="10" />
</bean>
项目中配置了多个数据源,在使用impala查询后需要切换数据源到主数据库
public class ApplicationUtil implements ApplicationContextAware {
private static ApplicationContext appCtx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appCtx = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return appCtx;
}
public static Object getBean(String name){
return appCtx.getBean(name);
}
}
连接impala进行查询
PreparedStatement state = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Connection connection = null;
ComboPooledDataSource dataSource =null;
try {
dataSource = (ComboPooledDataSource) ApplicationUtil
.getBean("dataSourcePid");
connection = DataSourceUtils.getConnection(dataSource);
//查询前先更新impala元数据
stmt = connection.prepareStatement("refresh pid.i_f_dwr_pnl_dist");
state=connection.prepareStatement(str.toString());
stmt.execute();
rs=state.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
Map<String, Object> rowData = new HashMap<>();
for (int k = 1; k <= columnCount; k++) {
rowData.put(md.getColumnName(k), rs.getObject(k));
}
list.add(rowData);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null){
rs.close();
}
if(state != null){
state.close();
}
if(stmt != null){
stmt.close();
}
if(connection !=null){
connection.close();
}
DataSourceUtils.releaseConnection(connection, dataSource);
} catch (Exception e) {
e.printStackTrace();
}
DataSources.setCustomerType("EXP");
}