• 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

  • 相关阅读:
    Jquery对象与DOM对象之间的转换
    关于Content-Type中application/x-www-form-urlencoded 和 multipart/form-data的区别及用法
    ${pageContext.request.contextPath} :JSP取得绝对路径方法
    servlet到底是什么?
    get和post的区别
    HTTP请求返回状态码详解
    XMLHttpRequest对象的readyState和status区别
    hdu 3594 仙人掌图
    hdu 4744 最小费用流
    hdu 4729 树链剖分
  • 原文地址:https://www.cnblogs.com/swordfall/p/10996862.html
Copyright © 2020-2023  润新知