1. 程式人生 > > java連線impala查詢大資料

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");
      }
.