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配置依赖
"1.0" encoding="UTF-8"?>"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"> 4.0.0 com.impala test 1.0-SNAPSHOT com.cloudera.impala.jdbc hive_metastore 1.0.0 com.cloudera.impala.jdbc ImpalaJDBC41 1.0.0 com.cloudera.impala.jdbc ql 1.0.0 com.cloudera.impala.jdbc TCLIServiceClient 1.0.0 commons-dbutils commons-dbutils 1.6 org.apache.thrift libfb303 0.9.0 org.apache.thrift libthrift 0.9.0 log4j log4j 1.2.14 org.slf4j slf4j-api 1.5.11 org.slf4j slf4j-log4j12 1.5.11 com.mchange c3p0 0.9.5.2 org.apache.maven.plugins maven-compiler-plugin 3.6.0 1.8
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配置文件,如下:
"1.0" encoding="UTF-8" standalone="no"?> "text/xsl" href="configuration.xsl"?>javax.jdo.option.ConnectionURL jdbc:mysql://192.168.31.249:3306/hive javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456 hive.metastore.schema.verification false system:java.io.tmpdir /opt/hadoop/app/apache-hive-2.3.5-bin/tmp system:user.name hive_user
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 staticList queryList(Class entityClass, String sql, Object... params) { List list = null; try { list = queryRunner.query(sql, new BeanListHandler (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(); Listlist = 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