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? |
Structured | Snappy, GZIP; currently Snappy by default | Yes. | 支持:CREATE TABLE, INSERT, 查询 | |
Unstructured | LZO | CREATE TABLE 语句,默认的文件格式就是未压缩文本,使用 ASCII 0x01 字符进行分割(通常对应 Ctrl-A). | 支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据 | |
Structured | Snappy, GZIP, deflate, BZIP2 | No, create using Hive. | 仅支持查询,在 Hive 中加载数据 | |
Structured | Snappy, GZIP, deflate, BZIP2 | Yes. | 仅支持查询,在 Hive 中加载数据 | |
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 成本