java连接impala查询大数据

这里先简单介绍下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");
      }
    原文作者:cxhao_123
    原文地址: https://blog.csdn.net/rixingbeioul46364/article/details/78733082
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞