Impala支持的文件格式
Impala 支持几种熟悉的 Apache Hadoop 中使用的文件格式。Impala 可以加载或查询其他 Hadoop 组件如 Pig 或 MapReduce 产生的数据文件,并且 Impala 产生的数据文件也可以被其他组件使用。
Impala 表使用的文件格式具有重要的性能意义。一些文件格式包括压缩支持,会影响到硬盘上数据的大小,因此,也影响反序列化数据时所需的 I/O 和 CPU 资源的数量。因为查询通常以移动和解压缩数据开始,所需的 I/O 和 CPU 资源是查询性能的限制因素。为了避免处理过程中这一部分潜在的冲突,数据通常进行压缩。通过压缩数据,更小的字节数从硬盘传输给内存。这减少了传输数据的时间,但应权衡考虑 CPU 解压缩内容的时间。
Impala可以对Hadoop中大多数格式的文件进行查询。它能通过create table和insert的方式将一部分格式的数据加载到table中,但是,有一些格式的数据它无法写入(write to)。对于impala无法写入的数据格式,我们只能通过hive建表,通过hive进行数据的写入,然后使用impala对这些保存好的数据执行查询操作。
文件类型 | 文件格式 | 压缩编码 | 能否create | 能否insert |
Parquet | 结构化 | Snappy GZIP | 能 | 能 |
Text | 非结构化 | LZO | 能 如果建表时没有指定存储类型,默认采用未压缩的text,字段由ASCII编码的0x01字符串分割 | 能 如果使用了LZO压缩,则只能通过hive建表和插入数据 |
Avro | 结构化 | Snappy GZIP Deflate BZIP2 | 在impala1.4.0或者更高版本上支持,之前的版本只能通过hive来建表 | 不能 只能通过load data的方式将已经转换好格式的数据加载进去,或者使用hive来插入数据 |
RCFile | 结构化 | Snappy GZIP Deflate BZIP2 | 能 | 不能 只能通过load data的方式将已经转换好格式的数据加载进去,或者使用hive来插入数据 |
SequenceFile | 结构化 | Snappy GZIP Deflate BZIP2 | 能 | 不能 只能通过load data的方式将已经转换好格式的数据加载进去,或者使用hive来插入数据 |
Impala支持以下压缩编码:
- Snappy-推荐的编码,因为它在压缩率和解压速度之间有很好的平衡性,snappy压缩速度快,但是不如GZIP那样能节省更多的存储空间。Impala不支持snappy压缩的text 文件。
- GZIP-压缩比很高能节省很多存储空间,期望达到最大压缩比(最少硬盘空间)时推荐;impala不支持GZIP压缩的text文件。
- Deflate-impala不支持GZIP压缩的text文件。
备注:gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分;
deflate是一种压缩算法,是huffman编码的一种加强。
deflate与gzip解压的代码几乎相同,可以合成一块代码。但也是有区别的,这里就不介绍了,可以自行百度一下。
根据有关GZip和Deflate的资料说明,Deflate只是一种过时的网页压缩,现在浏览器对其支持并不好,应该禁用deflate压缩。
- BZIP2-impala不支持BZIP2压缩的text文件。
- LZO-只用于text文件,impala可以查询LZO压缩的text格式数据表,但是不支持create和insert数据,可以先在 Hive 中创建这些表,在 impala-shell 中执行 INVALIDATE METADATA table_name语句,然后通过 Impala 查询这些表。
如何选择Impala表底层文件的格式?
不同的文件格式和压缩编码适合不同的数据集。无论文件格式如何,Impala 通常可以提供不错的性能收益,但为表的底层数据选择合适的格式可以获得进一步的性能提升。 对于特定的表,考虑以下因素来确定采用哪种文件格式和压缩方式的组合:
假如你正在使用的文件是已经支持的文件格式,实用起见 Impala 表应采用相同的格式。如果原始的文件格式无法提供可接受的查询性能或资源利用率,可以考虑创建一个使用不同文件格式和压缩编码的新表,并使用 INSERT 语句通过复制数据文件到新表做一次转换。依赖于文件格式的不同,你可能需要在 impala-shell 或 Hive 中执行 INSERT 语句。
文本格式文件可以使用多种工具方便的生成,且在验证和调试时易于阅读。这些特性就是文本文件是 Impala CREATE TABLE 语句的默认格式的原因。当需要考虑性能和资源使用时,可以使用其他文件格式和压缩编码方式。典型的步骤如下:先将文本格式文件载入一个impala表中,然后使用 INSERT ... SELECT 语法复制数据到另一个使用其他更紧凑的文件格式的impala表中。
如果您的体系结构涉及将要查询的数据存储在内存中不要进行压缩。因为不需要把数据移动到硬盘上,没有 I/O 节省,但解压数据时会有 CPU 成本。