1、介绍
什么是Impala?
mpala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。它是一个用C +和Java编写的开源软件。与其他Hadoop的SQL引擎相比,它提供了高性能和低延迟。
换句话说,Impala是性能最高的SQL引擎(提供类似RDBMS的体验),它提供了访问存储在Hadoop分布式文件系统中的数据的最快方法
impala与hive的关系
impala是基于hive的大数据分析查询引擎,直接使用hive的源数据库metadata,意味着impala元数据都存储在hive的metastore当中,并且impala兼容hive的绝大多数sql语法。所以安装impala,先安装hive,并且要启动hive的metastore服务。
hive元数据包含hive创建的database、table等元信息。元数存储在关系型数据库中,如Derby、MySQL等。
客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。
impala与hive的异同
impala与hive都是建构在Hadoop之上的数据查询工具各有不同的侧重适用面,但从客户端使用来看impala和hive有很多共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。
但是impala与hive最大的区别是:没有使用MapReduce进行并行计算。impala把整个查询分成执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。impala使用服务的方式避免每次执行查询都需要启动的开销,即比hive少了MapReduce启动时间。
执行流程
Hive: 依赖于 MapReduce 执 行 框 架 , 执 行 计 划 分 成map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个 Query 会 被编译成多轮 MapReduce,则会有更多的写中间结果。由于 MapReduce 执行框架本身的特点,过多的中间过程会增加整个 Query 的执行时间。
Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个 Impalad 执行查询,而不用像 Hive 那样把它组合成管道型的map->reduce 模式,以此保证 Impala 有更好的并发性和避免不必要的中间 sort 与shuffle。
数据流
Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
Impala: 采用拉的方式,后续节点通过 getNext 主动向前面节点要数据,以
此方式数据可以流式的返回给客户端,且只要有 1 条数据被处理完,就可以立即
展现出来,而不用等到全部处理完成,更符合 SQL 交互式查询使用。
内存使用
Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证 Query能顺序执行完。每一轮 MapReduce 结束,中间结果也会写入 HDFS 中,同样由于MapReduce 执行架构的特性,shuffle 过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,版本 1.0.1 是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得 Impala 目前处理 Query 会受到一定的限制,最好还是与 Hive 配合使用。
调度
Hive: 任务调度依赖于 Hadoop 的调度策略。
Impala: 调度由自己完成,目前只有一种调度器 simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。
容错
Hive: 依赖于 Hadoop 的容错能力。
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直
接返回错误(Impala 定位于实时查询,一次查询失败, 再查一次就好了,再查一次的成本很低)
适用面
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持 UDF,能处理的问题域有一定的限制,与 Hive 配合使用,对 Hive 的结果数据集进行实时分析。
关系数据库和Impala
Impala使用类似于SQL和HiveQL的Query语言。 下表描述了SQL和Impala查询语言之间的一些关键差异。
Impala | 关系型数据库 |
---|---|
Impala使用类似于HiveQL的类似SQL的查询语言。 | 关系数据库使用SQL语言。 |
在Impala中,您无法更新或删除单个记录。 | 在关系数据库中,可以更新或删除单个记录。 |
Impala不支持事务。 | 关系数据库支持事务。 |
Impala不支持索引。 | 关系数据库支持索引。 |
Impala存储和管理大量数据(PB)。 | 与Impala相比,关系数据库处理的数据量较少(TB)。 |
Hive,Hbase和Impala
虽然Cloudera Impala使用与Hive相同的查询语言,元数据和用户界面,但在某些方面它与Hive和HBase不同。 下表介绍了HBase,Hive和Impala之间的比较分析。
HBase | Hive | Impala |
---|---|---|
HBase是基于Apache Hadoop的宽列存储数据库。 它使用BigTable的概念。 | Hive是一个数据仓库软件。 使用它,我们可以访问和管理基于Hadoop的大型分布式数据集。 | Impala是一个管理,分析存储在Hadoop上的数据的工具。 |
HBase的数据模型是宽列存储。 | Hive遵循关系模型。 | Impala遵循关系模型。 |
HBase是使用Java语言开发的。 | Hive是使用Java语言开发的。 | Impala是使用C ++开发的。 |
HBase的数据模型是无模式的。 | Hive的数据模型是基于模式的。 | Impala的数据模型是基于模式的。 |
HBase提供Java,RESTful和Thrift API。 | Hive提供JDBC,ODBC,Thrift API。 | Impala提供JDBC和ODBC API。 |
支持C,C#,C ++,Groovy,Java PHP,Python和Scala等编程语言。 | 支持C ++,Java,PHP和Python等编程语言。 | Impala支持所有支持JDBC / ODBC的语言。 |
HBase提供对触发器的支持。 | Hive不提供任何触发器支持。 | Impala不提供对触发器的任何支持。 |
Impala的功能
以下是cloudera Impala的功能 -
-
Impala可以根据Apache许可证作为开源免费提供。
-
Impala支持内存中数据处理,即,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动。
-
您可以使用Impala使用类SQL查询访问数据。
-
与其他SQL引擎相比,Impala为HDFS中的数据提供了更快的访问。
-
使用Impala,您可以将数据存储在存储系统中,如HDFS,Apache HBase和Amazon s3。
-
您可以将Impala与业务智能工具(如Tableau,Pentaho,Micro策略和缩放数据)集成。
-
Impala支持各种文件格式,如LZO,序列文件,Avro,RCFile和Parquet。
-
Impala使用Apache Hive的元数据,ODBC驱动程序和SQL语法。
Impala的优点
以下是Cloudera Impala的一些值得注意的优点的列表。
-
使用impala,您可以使用传统的SQL知识以极快的速度处理存储在HDFS中的数据。
-
由于在数据驻留(在Hadoop集群上)时执行数据处理,因此在使用Impala时,不需要对存储在Hadoop上的数据进行数据转换和数据移动。
-
使用Impala,您可以访问存储在HDFS,HBase和Amazon s3中的数据,而无需了解Java(MapReduce作业)。您可以使用SQL查询的基本概念访问它们。
-
为了在业务工具中写入查询,数据必须经历复杂的提取 - 变换负载(ETL)周期。但是,使用Impala,此过程缩短了。加载和重组的耗时阶段通过新技术克服,如探索性数据分析和数据发现,使过程更快。
-
Impala正在率先使用Parquet文件格式,这是一种针对数据仓库场景中典型的大规模查询进行优化的柱状存储布局。
Impala的缺点
使用Impala的一些缺点如下 -
- Impala不提供任何对序列化和反序列化的支持。
- Impala只能读取文本文件,而不能读取自定义二进制文件。
- 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。
2、impala的结构
Impala 主要由 Impalad、 State Store、Catalogd 和 CLI 组成。
2.1. Impalad
Impalad: 与 DataNode 运行在同一节点上,由 Impalad 进程表示,它接收客户端的查询请求(接收查询请求的 Impalad 为 Coordinator,Coordinator 通过 JNI 调用 java前端解释 SQL 查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它 Impalad 进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给 Coordinator,由 Coordinator 返回给客户端。同时 Impalad 也与 State Store 保持连接,用于确定哪个 Impalad 是健康和可以接受新的工作。在 Impalad 中启动三个 ThriftServer: beeswax_server(连接客户端),hs2_server(借用 Hive 元数据),be_server(Impalad 内部使用)和一个 ImpalaServer 服务。
2.2. Impala State Store
Impala State Store: 跟踪集群中的 Impalad 的健康状态及位置信息,由statestored 进程表示,它通过创建多个线程来处理 Impalad 的注册订阅和与各Impalad 保持心跳连接,各 Impalad 都会缓存一份 State Store 中的信息,当 StateStore 离线后(Impalad 发现 State Store 处于离线时,会进入 recovery 模式,反复注册,当 State Store 重新加入集群后,自动恢复正常,更新缓存数据)因为 Impalad有 State Store 的缓存仍然可以工作,但会因为有些 Impalad 失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的 Impalad,导致查询失败。
2.3. CLI
CLI: 提供给用户查询使用的命令行工具(Impala Shell 使用 python 实现),同
时 Impala 还提供了 Hue,JDBC, ODBC 使用接口。
2.4. Catalogd
Catalogd:作为 metadata 访问网关,从 Hive Metastore 等外部 catalog 中获
取元数据信息,放到 impala 自己的 catalog 结构中。impalad 执行 ddl 命令时通过
catalogd 由其代为执行,该更新则由 statestored 广播。