1 impala介绍
Cloudera Impala是一款开源的MPP架构的SQL查询引擎,它提供在hadoop环境上的低延迟、高并发的BI/数据分析,是一款开源、与Hadoop高度集成,灵活可扩展的查询分析引擎,目标是基于SQL提供高并发的即席查询。
与其他的查询引擎系统(如presto、spark sql、hive sql)不同,Impala基于C++和Java编写,支持Hadoop生态下的多种组件集成(如HDFS、HBase、Metastore、YARN、Sentry等),支持多种文件格式的读写(如Parqeut、Avro、RCFile等)。
标准的mpp架构(Massive-Parallel Processing 海量并行处理架构),支持在上百台机器的Hadoop集群上执行快速查询,对底层的存储系统解耦,不像数据库要求那么严格,不同的底层存储可以联合查询。
2 impala在大数据应用处于什么环节及作用
impala在大数据应用领域中处于数据分析环节,利用mpp架构实现高效数据查询,下游应用系统使用impala也比较多,尤其在应用集市查询数据仓库的时候使用的较多。
3 impala架构体系
impala由catalog、statestore、impala daemon(impalad)组成。
catalog:
负责同步元数据(如hive的metastore),如果元数据发生变化则通过catalog服务通知给所有的impalad节点,impalad节点收到后会刷新已经缓存了的元数据,更新为最新的。
statestore:
是节点状态监控服务(报活),监控impalad状态的服务,如果有impalad故障则发布节点变化消息,底层是一个发布订阅模式的服务。
impalad:
是impala的核心组件,impalad 一般是和hdfs的datanode 在一个节点上,实现计算本地化。
impalad 包含query planner、coordinator、query execute engine三个核心组件。
query planner:负责解析查询SQL,并生成执行计划树(Query Plan Tree)。
coordinator:负责接收客户端请求,通过query planner 获取执行计划树,分配任务到相应的impalad节点的 query execute engine(根据元数据定位),汇聚请求结果返回客户端。
query execute engine:计算分配过来的任务,并返回计算结果到 coordinator(发起者)。
Impala daemon不间断的跟statestore进行通信交流,从而确认哪个节点是健康的能接收新的工作任务。它同时接收catalogd daemon(从Impala 1.2之后支持)传来的广播消息来更新元数据信息,当集群中的任意节点create、alter、drop任意对象、或者执行INSERT、LOAD DATA的时候触发广播消息。
4 impala任务执行流程
-
通过jdbc等驱动发送查询sql到任意impalad节点。
-
某个imaplad 的 coordinator(发起者)接收到请求后,让 planner解析用户SQL请求,生成查询计划树,并返回给coordinator。
-
接收到任务的impalad节点的coordinator收到查询计划树,分配任务到相应的impalad节点执行。
-
相应的impalad 节点的 Query Executor 接收其他的coordinator(发起者)发过来的查询请求,执行本地查询。
-
impalad执行本地扫描,查询时使用LLVM进行代码生成、编译、执行,然后把结果返回给coordinator(发起者)。
- coordinator(发起者)汇总结果,返回给client客户端。
在生产环境运行产品级的应用时,我们应该循环(按顺序)的在不同节点上面提交查询,这样才能使得集群的负载达到均衡。
5 impala支持的文件格式
Impala可以对Hadoop中大多数格式的文件进行查询,通过create table和insert的方式将一部分格式的数据加载到table中,但值得注意的是,有一些格式的数据它是无法写入的(write to),对于Impala无法写入的数据格式,通常是通过Hive建表,使用Hive进行数据的写入,然后使用Impala来对这些保存好的数据执行查询操作。
文件类型 | 文件格式 | 压缩编码 | CREATE | INSERT |
---|---|---|---|---|
Parquet | 结构化 | Snappy、GZIP | Y | Y |
Text | 非结构化 | LZO | Y。默认采用未压缩的text,字段由ASCII编码的0x01字符串分割。 | Y。如果使用了LZO压缩,则只能通过Hive建表和插入数据。 |
Avro | 结构化 | Snappy、GZIP、Deflate、BZIP2 | 在Impala 1.4.0 或者更高的版本上支持,之前的版本只能通过Hive来建表 | N。只能通过LOAD DATA的方式将已经转换好格式的数据加载进去,或者使用Hive来插入数据。 |
RCFile | 结构化 | Snappy、GZIP、Deflate、BZIP2 | Y | N。只能通过LOAD DATA的方式将已经转换好格式的数据加载进去,或者使用Hive来插入数据。 |
SequenceFile | 结构化 | Snappy、GZIP、deflate、BZIP2 | Y | N。只能通过LOAD DATA的方式将已经转换好格式的数据加载进去,或者使用Hive来插入数据。 |
所以在impala中最常见的格式是parquet压缩格式Snappy – 推荐的编码,在压缩率和解压速度之间有很好的平衡性,Snappy压缩速度很快,但是不如bzip2那样能节约更多的存储空间,Impala不支持Snappy压缩的text file。
6 Parquet
6.1 概述
Parquet 是 Hadoop 生态圈中主流的列式存储格式,是Apache 顶级项目。
Apache Parquet是一种能够有效存储嵌套数据的列式存储格式。每一个数据模型的schema包含多个字段,每一个字段又可以包含多个字段,每一个字段有三个属性:重复数、数据类型和字段名,重复数可以是以下三种:required(出现1次),repeated(出现0次或多次),optional(出现0次或1次)。每一个字段的数据类型可以分成两种:group(复杂类型)和primitive(基本类型)。
构成了树的结构
Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎和计算框架都已适配,并且可以很方便的将其它序列化工具生成的数据转换成Parquet格式。
查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
数据模型: Avro, Thrift, Protocol Buffers, POJOs
Parquet 的项目组成及自下而上交互的方式如图所示:
这里可以将其分为三层。
数据存储层:
定义 Parquet 文件格式,其中元数据在 parquet-format 项目中定义,包括 Parquet 原始类型定义、Page类型、编码类型、压缩类型等等。
对象转换层:
这一层在 parquet-mr 项目中,包含多个模块,作用是完成其他对象模型与 Parquet 内部数据模型的映射和转换,Parquet 的编码方式使用的是 striping and assembly 算法。
对象模型层:
定义如何读取 Parquet 文件的内容,这一层转换包括 Avro、Thrift、Protocal Buffer 等对象模型/序列化格式、Hive serde 等的适配。并且为了帮助大家理解和使用,Parquet 提供了 org.apache.parquet.example 包实现了 java 对象和 Parquet 文件的转换。
这里可以将其分为三层。
6.2 Parquet 文件格式
Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。
Parquet文件由一个文件头(header),一个或多个紧随其后的文件块(block),以及一个用于结尾的文件尾(footer)构成。
每个文件块主要由行组(Row Group)、列块(Column Chuck)、页(Page)组成。
行组(Row Group):
Parquet 在水平方向上将数据划分为行组,默认行组大小与 HDFS Block 块大小对齐,Parquet 保证一个行组会被一个 Mapper 处理。
列块(Column Chunk):
行组中每一列保存在一个列块中,一个列块具有相同的数据类型,不同的列块可以使用不同的压缩算法。
页(Page):
Parquet 是页存储方式,每一个列块包含多个页,一个页是最小的编码的单位,同一列块的不同页可以使用不同的编码方式。
另外 Parquet 文件还包含header与footer信息,分别存储文件的校验码与Schema等信息。文件格式如下:
文件头(header):
都是该文件的Magic Code,用于校验它是否是一个Parquet文件。
文件尾(Footer):
Footer length 存储了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量。
文件的元数据中包括每一个行组的元数据信息和当前文件的Schema信息。除了文件中每一个行组的元数据,每一页的开始都会存储该页的元数据。
在Parquet中,有三种类型的页:数据页、字典页和索引页。
数据页用于存储当前行组中该列索引值。
字典页存储该列值的编码字典,每一个列块中最多包含一个字典页。
索引页用来存储当前行组下该列的索引。
6.3 parquet 数据类型
7 impala与hive对比
- 关系图:
-
执行计划:
Hive:
依赖于MapReduce执行框架,执行计划分成 map->shuffle->reduce->map->shuffle->reduce…模型,一个Query会被编译成多轮MapReduce,则会有更多的写中间结果,由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
Impala:
把执行计划表现为一棵完整的执行计划树,分发执行计划到各个Impalad执行查询,把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
-
数据流:
Hive:
采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
Impala:
采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
-
内存使用:
Hive:
在执行过程中如果内存放不下所有数据,则会使用外存(断电了,存储的数据不丢失,磁盘),以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
Impala:
在遇到内存放不下数据时,如果开启了溢写磁盘开关会将数据溢写到磁盘,否则oom。
-
适用场景:
Hive:适合大批量跑批任务。
Impala:适合交互式查询需求。
8 impala数据类型
Hive数据类型 | Impala数据类型 | 长度 |
---|---|---|
TINYINT | TINYINT | 1byte有符号整数 |
SMALINT | SMALINT | 2byte有符号整数 |
INT | INT | 4byte有符号整数(32位) |
BIGINT | BIGINT | 8byte有符号整数(64位) |
BOOLEAN | BOOLEAN | 布尔类型,true或者false |
FLOAT | FLOAT | 单精度浮点数 |
DOUBLE | DOUBLE | 双精度浮点数 |
STRING | STRING | 字符系列,可以使用单引号或者双引号 |
TIMESTAMP | TIMESTAMP | 时间类型 |
BINARY | 不支持 | 字节数组 |
impala 只有 timestamp类型,没有date类型