Impala集成C3P0的連接方式


1. 概述

  Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。【百度百科】

  Impala是用於處理存儲在Hadoop集群中的大量數據的MPP(大規模並行處理)SQL查詢引擎。它是一個用C++和Java編寫的開源軟件。與其他Hadoop的SQL引擎相比,它提供了高性能和低延遲。換句話說,Impala是性能最高的SQL引擎(提供類似DBMS的體驗),它提供了訪問存儲在Hadoop分布式系統中的數據的最快方法。

2. 比較區別

2.1 關系數據庫和Impala

  Impala使用類似於SQL和HiveQL的Query語言。下表描述了SQL和Impala查詢語言之間的一些關鍵差異。

Impala 關系型數據庫
Impala使用類似於HiveQL的類似SQL的查詢語言 關系數據庫使用SQL語言
在Impala中,你無法更新或刪除單個記錄 在關系數據庫中,可以更新或刪除單個記錄
Impala不支持事務 關系數據庫支持事務
Impala不支持索引 關系數據庫支持索引
Impala存儲和管理大量數據(PB) 與Impala相比,關系數據庫處理的數據量較少(TB)

2.1 Hive,HBase和Impala

  Impala使用與Hive相同的查詢語言,元數據和用戶界面,但在某些方面它與Hive和HBase不同。

HBase Hive Impala
HBase是基於Apache Hadoop的寬列存儲數據庫。它使用BigTable的概念 Hive是一個數據倉庫軟件。使用它,我們可以訪問和管理基於Hadoop的大型分布式數據集 Impala是一個管理,分析存儲在Hadoop上的數據的工具
 HBase的數據模型是寬列存儲  Hive遵循關系模型  Impala遵循關系模型
 HBase是使用Java語言開發的  Hive是使用Java語言開發的  Impala是使用C++開發的
 HBase的數據模型是無模式的  Hive的數據模型是基於模式的  Impala提供JDBC和ODBC API
 支持C,C#,C++,Groovy,Java,PHP,Python和Scala等編程語言  支持C++,Java,PHP和Python等編程語言  Impala支持所有支持JDBC/ODBC的語言
 HBase提供Java,RESTful和Thrift API  Hive提供JDBC,ODBC,Thrift API  Impala支持所有支持JDBC/ODBC的語言
 HBase提供對觸發器的支持  Hive不提供任何觸發器支持 Impala不提供對觸發器的任何支持 

3. Impala開發步驟

使用IDEA作為開發工具

3.1 下載Impala依賴包

  https://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-30.html

  下圖就是上述下載依賴包解壓得到的:

  

3.2 把Impala依賴包導入本地maven倉庫

  把上述紅框的jar包導入到本地maven倉庫,因為在maven倉庫中心沒有impala的依賴包。輸入命令如下:

  mvn install:install-file -Dfile=ImpalaJDBC41.jar -DgroupId=com.cloudera.impala.jdbc -DartifactId=ImpalaJDBC41 -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

  mvn install:install-file -Dfile=ql.jar -DgroupId=com.cloudera.impala.jdbc -DartifactId=ql -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

  mvn install:install-file -Dfile=TCLIServiceClient.jar -DgroupId=com.cloudera.impala.jdbc -DartifactId=TCLIServiceClient -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

  成功導入的結果如下:

  

3.3 pom.xml配置依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.impala</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.cloudera.impala.jdbc</groupId>
            <artifactId>hive_metastore</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.cloudera.impala.jdbc</groupId>
            <artifactId>ImpalaJDBC41</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.cloudera.impala.jdbc</groupId>
            <artifactId>ql</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.cloudera.impala.jdbc</groupId>
            <artifactId>TCLIServiceClient</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libfb303</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.11</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.11</version>
        </dependency>
        <!--c3p0連接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3.4 C3P0的配置文件

  根目錄/resource下的配置文件

  c3p0.properties配置文件,如下:

c3p0.driverClass=com.cloudera.impala.jdbc41.Driver
c3p0.jdbcUrl=jdbc:impala://192.168.31.249:21050/meerkat;AuthMech=0;
#c3p0.user=myoracle
#c3p0.password=myoracle

  hive-site.xml配置文件,如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://192.168.31.249:3306/hive</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
        </property>
        <property>
                <name>hive.metastore.schema.verification</name>
                <value>false</value>
        </property>
        <property>
                <name>system:java.io.tmpdir</name>
                <value>/opt/hadoop/app/apache-hive-2.3.5-bin/tmp</value>
        </property>
        <property>
                <name>system:user.name</name>
                <value>hive_user</value>
        </property>
</configuration>

3.5 C3P0的連接方式

package com.impala.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @ClassName: ImpalaC3P0Util
 * @Description: TODO
 * @Author TanXiongZhan
 * @Date 2019/7/1
 */
public class ImpalaC3P0Util {

    private static DataSource ds;
    private static QueryRunner queryRunner;

    static {
        ds = new ComboPooledDataSource();
        queryRunner = new QueryRunner(ImpalaC3P0Util.getDatasSource());
    }

    public static DataSource getDatasSource() {
        return ds;
    }

    public static Connection getConn() {
        Connection con = null;
        try {
            con = ds.getConnection();//每一次從ds中獲取一個新的連接
        } catch (Exception e) {
            e.printStackTrace();
        }
        return con;
    }

    public static void update(String sql) {
        try {
            queryRunner.update(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static <T> List<T> queryList(Class<T> entityClass, String sql, Object... params) {

        List<T> list = null;
        try {
            list = queryRunner.query(sql, new BeanListHandler<T>(entityClass), params);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return list;
    }

}

3.6 集成C3P0測試

  Record類如下:

package com.impala.model;

/**
 * @Author: Yang JianQiu
 * @Date: 2019/7/15 16:13
 */
public class Record {

    private String imsi;
    private Long uptime;

    public String getImsi() {
        return imsi;
    }

    public void setImsi(String imsi) {
        this.imsi = imsi;
    }

    public Long getUptime() {
        return uptime;
    }

    public void setUptime(Long uptime) {
        this.uptime = uptime;
    }
}

  測試代碼:

package com.impala.test;

import com.impala.model.ImsiRecord;
import com.impala.model.Record;
import com.impala.util.ImpalaC3P0Util;

import java.util.List;

/**
 * @Author: Yang JianQiu
 * @Date: 2019/7/15 16:17
 */
public class Test {
    public static void main(String[] args) {
        String sql = "select imsi, uptime from imsi_record_by_hour order by uptime  limit 10 ";

        Record record = new Record();
        List<Record> list = ImpalaC3P0Util.queryList(Record.class, sql);

        for (Record record1: list){
            System.out.println(record1.getImsi() + "-" + record1.getUptime());
        }
    }
}

3.7 結果查看

4. 總結

【github地址】

https://github.com/SwordfallYeung/ImpalaDemo.git

【參考資料】
https://www.cnblogs.com/wcwen1990/p/7750954.html

http://lxw1234.com/archives/2017/06/862.htm

https://www.cnblogs.com/shaosks/p/9528228.html

https://blog.csdn.net/weixin_39478115/article/details/77505852  impala兩種方式同步hive元數據

https://gitee.com/xany/yoshop_wechat

https://blog.csdn.net/linxiyimeng007/article/details/80943378

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM