Impala相关基础知识
文章目录
1. Impala简介
Impala是由Cloudera公司推出,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。Impala基于Hive,提供内存计算,已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速。
2. Impala的优点
一般来说,Impala可以替代Hive进行快速的查询,Impala的优点如下:
- 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销
- Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,省掉了MapReduce作业启动的开销,直接访问存储在HDFS/HBase中的数据进行作业调度,速度快。
- 尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销
- 可以访问hive的metastore,对hive数据直接做数据分析
3. Impala的缺点
- 对内存的依赖大,且完全依赖于hive
- 实践中,分区超过1万,性能严重下降
- 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新,资源不不能通过YARN统⼀资源管理理调度,所以Hadoop集群⽆无法实现Impala、Spark、Hive等组件的动态资源共享
4. Impala与Hive的联系
- Hive: 复杂的批处理理查询任务,数据转换任务,对实时性要求不高同时数据量量又很大的场景。
- Impala:实时数据分析,与Hive配合使用,对Hive的结果数据集进行实时分析。impala不不能完全取代hive,impala可以直接处理hive表中的数据。
- Hive对于原数据的更新操作不能被Impala感知到。
- Impala对原数据的更新操作可以被Hive感知到。
5. Hive与Impala数据类型
Hive数据类型 | Impala数据类型 | 长度 |
---|---|---|
TINYINT | TINYINT | 1byte有符号整数 |
SMALINT | SMALINT | 2byte有符号整数 |
INT | INT | 4byte有符号整数 |
BIGINT | BIGINT | 8byte有符号整数 |
BOOLEAN | BOOLEAN | 布尔类型,true或者false |
FLOAT | FLOAT | 单精度浮点数 |
DOUBLE | DOUBLE | 双精度浮点数 |
STRING | STRING | 字符系列。可以指定字符集。可以使用单引号或者双引号 |
TIMESTAMP | TIMESTAMP | 时间类型 |
BINARY | 不支持 | 字节数组 |
6. 使用Impala操作数据
使用Scala语言来进行Impala的相关操作。
/*
* 需要在resources添加spark相关配置文件
*/
object ImpalaTest {
var jdbcTemplate: JdbcTemplate = null
var dataSource: ComboPooledDataSource = null
// driverName
private val driverClass: String = "com.cloudera.impala.jdbc41.Driver"
// jdbc连接url
private val defaultConnectUrl: String = "jdbc:impala://192.168.60.201:21050/ods_frtfd;AuthMech=3;UID=admin;PWD=admin;UseSasl=0";
private val minPoolSize: Int = 3
private val acquireIncrement: Int = 5
private val maxPoolSize: Int = 20
private val checkoutTimeout: Int = 180000
def main(args: Array[String]): Unit = {
jdbcTemplate = new JdbcTemplate();
dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driverClass)
dataSource.setJdbcUrl(defaultConnectUrl)
dataSource.setMinPoolSize(minPoolSize)
dataSource.setMaxPoolSize(maxPoolSize)
dataSource.setAcquireIncrement(acquireIncrement)
dataSource.setCheckoutTimeout(checkoutTimeout)
jdbcTemplate.setDataSource(dataSource)
val sql: String = "select * from ods_frtfd.ods_ind_doc where date_ymd = '2021-11-03'"
// 查询Hive中的数据
val list: util.List[OdsIndDoc] = jdbcTemplate.query(sql, new BeanPropertyRowMapper[OdsIndDoc](classOf[OdsIndDoc]))
println(list.toString)
}
}
参考链接
https://baike.baidu.com/item/Impala/7458017?fr=aladdin
https://www.cnblogs.com/dw-date/p/13891071.html
https://blog.youkuaiyun.com/weixin_45586042/article/details/107752404
https://www.cnblogs.com/dw-date/p/13891071.html