Impala 如何使用 Hadoop 文件格式



Impala 支持几种熟悉的 Apache Hadoop 中使用的文件格式。Impala 可以加载或查询其他 Hadoop 组件如 Pig 或 MapReduce 产生的数据文件,并且 Impala 产生的数据文件也可以被其他组件使用。下面的章节讨论 Impala 使用各种文件格式的步骤、限制和性能注意事项。

Impala 表使用的文件格式具有重要的性能意义。一些文件格式包括压缩支持,会影响到硬盘上数据的大小,因此,也影响反序列化数据时所需的 I/O 和 CPU 资源的数量。因为查询通常以移动和解压缩数据开始,所需的 I/O 和 CPU 资源是查询性能的限制因素。为了避免处理过程中这一部分潜在的冲突,数据通常进行压缩。通过压缩数据,更小的字节数从硬盘传输给内存。这减少了传输数据的时间,但应权衡考虑 CPU 解压缩内容的时间。

Impala 可以查询 Hadoop 中最通用的文件编码和压缩编码(Impala can query files encoded with most of the popular file formats and compression codecs used in Hadoop)。Impala 可以创建并插入数据到部分而不是全部文件格式;对于 Impala 无法写入的文件格式,在 Hive 中创建这些表,在 impala-shell 中执行 INVALIDATE METADATA 语句,并通过 Impala 查询这些表。文件格式可以是结构化的,他们可能包含元数据和内置的压缩支持。支持的文件格式包括:


Table 1. File Format Support in Impala


File Type

Format

Compression Codecs

Impala Can CREATE?

Impala Can INSERT?

Parquet

Structured

Snappy, GZIP; currently Snappy by default

Yes.

支持:CREATE TABLE, INSERT, 查询

Text

Unstructured

LZO

CREATE TABLE 语句,默认的文件格式就是未压缩文本,使用 ASCII 0x01 字符进行分割(通常对应 Ctrl-A).

支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据

Avro

Structured

Snappy, GZIP, deflate, BZIP2

No, create using Hive.

仅支持查询,在 Hive 中加载数据

RCFile

Structured

Snappy, GZIP, deflate, BZIP2

Yes.

仅支持查询,在 Hive 中加载数据

SequenceFile

Structured

Snappy, GZIP, deflate, BZIP2

Yes.

仅支持查询,在 Hive 中加载数据



Impala 支持下列压缩编解码器:

  • Snappy. 因其在压缩比和解压速度间的有效平衡而推荐。Snappy 压缩非常快,而 GZIP 压缩比更高
  • GZIP. 期望达到最大压缩比(最少硬盘空间)时推荐
  • Deflate.
  • BZIP2.
  • LZO, 仅支持文本文件。Impala 可以查询 LZO 压缩文本文件表,但目前无法创建和插入数据;在 Hive 中执行这些操作





选择表的文件格式



不同的文件格式和压缩编解码器适合不同的数据集。尽管无论文件格式如何,Impala 通常可以提升性能收益,但是为你的数据选择合适的格式可以获得进一步的性能提升。 对于特定的表,考虑以下因素来确定采用哪种文件格式和压缩方式的组合:

  • 假如你正在使用的文件是已经支持的文件格式,实用起见 Impala 表应采用相同的格式。加入原始的文件格式无法提供可接受的查询性能和资源使用,考虑创建一个使用不同文件格式和压缩特征的新表,并使用 INSERT 语句通过复制数据文件到新表做一次转换。依赖于文件格式的不同,你可能需要在 impala-shell 或 Hive 中执行 INSERT 语句
  • 文本文件格式可以使用多种工具方便的生成,并且人类可读易于严重和调试。这些特性就是为什么文本文件是 Impala CREATE TABLE 语句的默认格式。当性能和资源使用是主要考虑时,使用其他格式之一并考虑压缩。一个典型的工作流可能涉及通过复制 CSV 或 TSV 文件到对应的数据目录把数据存入 Impala 表中,然后使用 INSERT ... SELECT 语法复制数据到使用其他更紧凑的文件格式的表中
  • 假如你的架构涉及到存放在内存中被查询的数据,不要进行压缩。这时没有 I/O 节省因为不需要把数据移动到硬盘上,但是解压数据会有 CPU 成本