1.impala 理论

教程 阿布都的都 ⋅ 于 2023-01-06 20:31:26 ⋅ 974 阅读

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在大数据应用处于什么环节及作用

file

​ impala在大数据应用领域中处于数据分析环节,利用mpp架构实现高效数据查询,下游应用系统使用impala也比较多,尤其在应用集市查询数据仓库的时候使用的较多。

3 impala架构体系

file

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任务执行流程

file

  1. 通过jdbc等驱动发送查询sql到任意impalad节点。

  2. 某个imaplad 的 coordinator(发起者)接收到请求后,让 planner解析用户SQL请求,生成查询计划树,并返回给coordinator。

  3. 接收到任务的impalad节点的coordinator收到查询计划树,分配任务到相应的impalad节点执行。

  4. 相应的impalad 节点的 Query Executor 接收其他的coordinator(发起者)发过来的查询请求,执行本地查询。

  5. impalad执行本地扫描,查询时使用LLVM进行代码生成、编译、执行,然后把结果返回给coordinator(发起者)。

  6. 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(基本类型)。

file

构成了树的结构

file

​ 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 的项目组成及自下而上交互的方式如图所示:

file

这里可以将其分为三层。

数据存储层:

​ 定义 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)组成。

file

行组(Row Group):

​ Parquet 在水平方向上将数据划分为行组,默认行组大小与 HDFS Block 块大小对齐,Parquet 保证一个行组会被一个 Mapper 处理。

列块(Column Chunk):

​ 行组中每一列保存在一个列块中,一个列块具有相同的数据类型,不同的列块可以使用不同的压缩算法。

页(Page):

​ Parquet 是页存储方式,每一个列块包含多个页,一个页是最小的编码的单位,同一列块的不同页可以使用不同的编码方式。

​ 另外 Parquet 文件还包含header与footer信息,分别存储文件的校验码与Schema等信息。文件格式如下:

file

文件头(header):

​ 都是该文件的Magic Code,用于校验它是否是一个Parquet文件。

文件尾(Footer):

​ Footer length 存储了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量。

​ 文件的元数据中包括每一个行组的元数据信息和当前文件的Schema信息。除了文件中每一个行组的元数据,每一页的开始都会存储该页的元数据。

​ 在Parquet中,有三种类型的页:数据页、字典页和索引页。

​ 数据页用于存储当前行组中该列索引值。

​ 字典页存储该列值的编码字典,每一个列块中最多包含一个字典页。

​ 索引页用来存储当前行组下该列的索引。

6.3 parquet 数据类型

file

7 impala与hive对比

  • 关系图:

file

  • 执行计划:

    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类型

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-阿布都的都,http://hainiubl.com/topics/76072
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter