Impala官网翻译08-Impala方案设计指南

Impala方案设计指南

本主题中的指南可以帮助你构建一个优化的、可扩展的模式,这个模式可以与你现有的数据管理流程很好地集成。在进行任何概念验证工作、移植工作或部署到生产中之前,请将这些准则作为检查表。

如果您正在改编现有数据库或 Hive 模式以用于 Impala,请阅读本节中的指导原则,然后参阅《将 SQL 从其他数据库系统移植到 Impala》以了解具体的移植和兼容性提示。

 

优先选择二进制文件格式,而不是文本格式

为了节省空间,提高内存使用率和查询性能,对任何大型或密集查询的表使用二进制文件格式。Parquet文件格式对于数据仓库式的分析查询是最有效的。Avro是Impala支持的另一种二进制文件格式,您可能已经将其作为Hadoop ETL管道的一部分。

虽然Impala可以使用RCFile和SequenceFile文件格式创建和查询表,但由于这些格式基于文本的性质,这类表比较笨重,而且由于其面向行的布局,并没有针对数据仓库风格的查询进行优化。Impala 不支持对这些文件格式的表进行 INSERT 操作。

指南:

  • 对于大型的、对性能要求很高的表来说,要想获得高效、可扩展的格式,请使用Parquet文件格式。
  • 为了在ETL过程中交付中间数据,使用其他Hadoop组件也可以使用的格式,Avro是一个合理的选择。
  • 为了方便导入原始数据,请使用文本表代替RCFile或SequenceFile,并在ETL过程的后期阶段转换为Parquet。

实际情况下使用Snappy压缩

Snappy压缩涉及到低CPU开销的解压,同时仍然提供大量的空间节省。在您可以选择压缩编解码器的情况下,比如Parquet和Avro文件格式,请使用Snappy压缩,除非您发现有令人信服的理由使用不同的编解码器。

 

优先选择数字类型而不是字符串

如果您有一些可以作为字符串或数字处理的数值(例如分区键列的YEAR、MONTH和DAY),请将它们定义为最小的适用整数类型。例如,YEAR可以是SMALLINT,MONTH和DAY可以是TINYINT。虽然你可能看不出分区表或文本文件在磁盘上的布局方式有什么不同,但使用数字类型可以节省二进制格式(如Parquet)的空间,在进行查询时,特别是联接等资源密集型查询时,也可以节省内存。

 

分区,但不要过度分区

分区是 Impala 性能调整的一个重要方面。按照Impala表分区中的程序,为您最大、最密集查询的表设置分区。

如果您从传统的数据库系统迁移到 Impala,或者刚开始进入大数据领域,您可能没有足够的数据量来利用现有的分区方案进行 Impala 并行查询。例如,如果你每天只有几十兆字节的数据,那么按年、月、日列进行分区可能会过于细化。在针对某一天的查询中,你的集群中的大部分可能都是闲置的,或者每个节点可能没有什么工作要做。考虑减少分区键列的数量,使每个分区目录包含价值几千兆字节的数据。

例如,考虑一个Parquet表,其中每个数据文件是1个HDFS块,最大块大小为1GB(在Impala 2.0和更高版本中,默认的Parquet块大小减少到256MB。在这个练习中,我们假设你通过设置查询选项PARQUET_FILE_SIZE=1g,将大小回升到了1GB)如果你有一个10个节点的集群,你需要10个数据文件(最大10GB)来给每个节点做一些查询的工作。但是每台机器上的每个核心都可以并行处理一个单独的数据块。在10节点集群上使用16核机器,一个查询可以完全并行处理高达160GB的数据。如果每个分区只有几个数据文件,那么不仅大多数集群节点在查询时处于闲置状态,这些机器上的大多数核心也是如此。

你可以将Parquet块大小降低到最低128 MB或64 MB,以增加每个分区的文件数量,提高并行性。但也可以考虑降低分区的级别,这样分析查询就有足够的数据来处理。

总是在加载数据后计算统计

Impala 大量使用有关整体表和每一列中数据的统计数据,以帮助规划资源密集型操作,如联接查询和插入到分区Parquet表中。因为这些信息只有在加载数据后才可用,所以在加载或替换表或分区中的数据后,要在表上运行COMPUTE STATS语句。

拥有准确的统计数据可以使操作成功,或者由于内存外错误或超时而失败。遇到性能或容量问题时,请始终使用 SHOW STATS 语句检查查询中所有表的统计数据是否存在且为最新数据。

在进行联接查询时,Impala 会查看每个联接表的统计数据,以确定它们的相对大小,并估计每个联接阶段产生的行数。当对Parquet表进行INSERT时,Impala会参考源表的统计数据,以确定如何分配为每个分区构造数据文件的工作。

关于COMPUTE STATS语句的语法,请参见COMPUTE STATS语句;关于表和列统计的所有性能考虑,请参见表和列统计。

 

用EXPLAIN和SUMMARY验证合理的执行计划

在执行资源密集型查询之前,使用EXPLAIN语句来了解Impala打算如何并行化查询和分配工作。如果发现查询计划效率低下,可以采取调优步骤,如更改文件格式、使用分区表、运行COMPUTE STATS语句或添加查询提示。有关所有这些技术的信息,请参见调整Impala的性能。

运行查询后,通过在 impala-shell 中发出 SUMMARY 命令,可以看到与性能相关的信息,了解查询的实际运行情况。在Impala 1.4之前,你可以使用PROFILE命令,但它的技术性很强的输出只对最有经验的用户有用。在Impala 1.4中新增的SUMMARY,总结了所有执行阶段、所有节点的最有用的信息,而不是将每个节点的数字分割出来。

 

上一篇:使用Sqoop导入导出parquet格式的Hive表


下一篇:简化数据获取!Uber开源深度学习分布训练库Petastorm