Impala相关基础知识

Impala相关基础知识

1. Impala简介

Impala是由Cloudera公司推出,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。Impala基于Hive,提供内存计算,已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速。

2. Impala的优点

一般来说,Impala可以替代Hive进行快速的查询,Impala的优点如下:

  1. 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销
  2. Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,省掉了MapReduce作业启动的开销,直接访问存储在HDFS/HBase中的数据进行作业调度,速度快。
  3. 尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销
  4. 可以访问hive的metastore,对hive数据直接做数据分析

3. Impala的缺点

  1. 对内存的依赖大,且完全依赖于hive
  2. 实践中,分区超过1万,性能严重下降
  3. 每当新的记录/文件被添加到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..net/weixin_45586042/article/details/107752404 https://www.cnblogs.com/dw-date/p/13891071.html
经验分享 程序员 微信小程序 职场和发展