Impala: SET语句的查询选项

Cloudera Enterprise 6.1.x


文章目录

Impala SET语句的查询选项

ABORT_ON_ERROR(default FALSE)

启用此选项后,Impala会在任何节点遇到错误时立即取消查询,可能返回不完整的结果。

默认情况下此选项是被禁用的,以帮助在发生错误时收集最大诊断信息

ALLOW_ERASURE_CODED_FILES(default FALSE)

ALLOW_UNSUPPORTED_FORMATS (default FALSE)

此查询选项已在CDH 6.1中删除

APPX_COUNT_DISTINCT (default FALSE)

启用此选项后,impala 会将 COUNT(DISTINCT) 转换为 NDV(),此时得到的计数是近似的而不是精确的。

BATCH_SIZE(default 0)

SQL运算符一次计算的行数。未指定或大小为0时,使用预定义的默认大小。使用大量数据可以提高响应速度,尤其是对于扫描操作,代价是占用更高的内存。
默认值0,意味着预定义的大小为1024。

此选项主要用于Impala开发期间的测试,或在Cloudera支持的指导下使用。

BUFFER_POOL_LIMIT (default MEM_LIMIT的80%)

定义查询可以从内部缓冲池分配的内存量限制。此限制的值适用于每个主机上的内存,而不是群集中的聚合内存。通常不会被用户更改,除非在查询期间诊断出内存不足错误。

此选项的默认设置是MEM_LIMIT的80%,如果查询遇到内存不足错误,请考虑将BUFFER_POOL_LIMIT设置降低到小于MEM_LIMIT设置的80%。

-- 设置一个绝对值
set buffer_pool_limit=8GB;

-- 设置一个相对值,MEM_LIMIT 值的 80%
set buffer_pool_limit=80%;

COMPRESSION_CODEC(default SNAPPY)

当Impala使用INSERT语句写入Parquet数据文件时,基础方式由 COMPRESSION_CODEC 选项控制。

注意:在Impala 2.0之前,此选项名为PARQUET_COMPRESSION_CODEC。 在Impala 2.0及更高版本中,无法识别PARQUET_COMPRESSION_CODEC名称。 对于新代码,使用更通用的名称COMPRESSION_CODEC。

语法:

SET COMPRESSION_CODEC=codec_name;

此查询选项的允许值为SNAPPY(默认值),GZIP和NONE,选项值不区分大小写。使用 COMPRESSION_CODEC = NONE 创建的Parquet文件通常仍小于原始数据

如果该选项设置为无法识别的值,则由于无效选项设置而导致的各种查询都将失败,而不仅仅是涉及Parquet表的查询。BZIP2的值也能被识别,但与Parquet表不兼容。

set compression_codec=gzip;
insert into parquet_table_highly_compressed select * from t1;

set compression_codec=snappy;
insert into parquet_table_compression_plus_fast_queries select * from t1;

set compression_codec=none;
insert into parquet_table_no_compression select * from t1;

set compression_codec=foo;
select * from t1 limit 5;
ERROR: Invalid compression codec: foo

COMPUTE_STATS_MIN_SAMPLE_SIZE(default 1GB)

COMPUTE_STATS_MIN_SAMPLE_SIZE 查询选项指定在 COMPUTE STATS TABLESAMPLE 中扫描的最小字节数。

DEBUG_ACTION (default 空字符串)

设置自定义问题条件,用于内部Cloudera调试和故障排除。

DECIMAL_V2 (default false)

用于修改与 DECIMAL 数据类型相关的行为。

目前不支持此查询选项。 其精确行为目前尚未定义,未来可能会发生变化。

DEFAULT_JOIN_DISTRIBUTION_MODE

根据 Impala COMPUTE STATS 语句生成的表统计信息优化 join 查询。默认情况下,当 join 查询中涉及的表没有数据时,Impala使用“广播”技术将表的全部内容传输到参与查询的所有执行程序节点。

如果联接中涉及的一个表具有统计信息而另一个表没有统计信息,则会广播没有统计信息的表。

如果两个表都缺少统计信息,则会广播连接右侧的表。

当涉及的表相对较小时,此行为是适当的,但如果正在广播的表很大,则可能导致过多的网络,内存和CPU开销。

由于Impala查询经常涉及非常大的表,并且此类表的 join 可能导致溢出或内存不足错误,因此设置 DEFAULT_JOIN_DISTRIBUTION_MODE = SHUFFLE 允许您覆盖默认行为。

shuffle join 机制使用散列算法划分连接查询中涉及的每个表的相应行,并将行的子集发送到其他节点以进行处理。

设置和部署集群时,建议设置 DEFAULT_JOIN_DISTRIBUTION_MODE = SHUFFLE,因为如果查询计划基于不完整的信息,则不太可能导致严重后果,例如溢出或内存不足错误。

允许的值为 BROADCAST(相当于0)或 SHUFFLE(相当于1)。

以下示例演示了此查询选项的每个设置项:

1、十亿行的大表

-- 创建一个十亿行的表.
create table big_table stored as parquet
  as select * from huge_table limit 1e9;

-- 对于没有统计数据的大表,
 - shuffle join机制是合适的。
set default_join_distribution_mode=shuffle;

...join queries involving the big table...

2、百行的小表

-- 创建一个百行表。
create table tiny_table stored as parquet
  as select * from huge_table limit 100;

-- 对于没有统计数据的小表,
 - 广播机制是合适的。
set default_join_distribution_mode=broadcast;

...join queries involving the tiny table...

3、统计表信息进行优化

compute stats tiny_table;
compute stats big_table;

-- 计算统计信息后,查询选项对涉及这些表的连接查询没有影响。
-- Impala可以通过检查每个表的行大小,基数等来确定连接查询每一侧的绝对大小和相对大小。

...join queries involving both of these tables...

DEFAULT_SPILLABLE_BUFFER_SIZE (default 2mb)

指定使用的内存缓冲区的默认大小,例如,针对没有统计信息的大型表或大型连接操作的查询。

指定参数大小单位可以为兆字节或前兆字节兆字节(m或mb)、千兆字节(g或gb)。 如果指定无法识别格式的值,则后续查询将失败并显示错误。

此查询选项设置内部缓冲区大小的上限,该大小可在溢出到磁盘操作期间使用。查询计划程序选择缓冲区的实际大小。

如果整体查询性能受溢出所需时间的限制,请考虑增加 DEFAULT_SPILLABLE_BUFFER_SIZE 设置。

较大的缓冲区大小会导致Impala向存储设备发出更大的I / O请求,这可能会导致更高的吞吐量,尤其是在磁盘上。

要通过限制可填充缓冲区大小来确定此设置的值是否有效,可以查看查询计划为特定查询选择缓冲区大小。

set default_spillable_buffer_size=4MB;

DISABLE_CODEGEN (default false )

DISABLE_CODEGEN 是一个调试选项,它用于解决Impala运行时代码生成的问题。
如果查询失败并显示“非法指令”或其他特定于硬件的消息,请尝试设置DISABLE_CODEGEN = true并再次运行查询。
如果仅在启用 DISABLE_CODEGEN 选项时查询成功,请将问题提交给Cloudera支持并在问题报告中包含该详细信息。

开启 DISABLE_CODEGEN = true 时,大多数查询的运行速度会明显变慢。

在Impala 2.10及更高版本中,DISABLE_CODEGEN_ROWS_THRESHOLD优化会自动禁用小型查询的codegen,因为短期运行的查询可以在没有codegen开销的情况下运行得更快。

DISABLE_CODEGEN_ROWS_THRESHOLD (default 50000)

此设置控制截止点(根据每个Impala守护程序处理的行数),低于该截止点,Impala会禁用整个查询的本机代码生成。本机代码生成对于处理很多行的查询非常有用,因为它减少了处理每一行所花费的时间。但是,生成本机代码会增加查询启动的延迟。因此,为处理相对少量数据的查询自动禁用codegen可以缩短查询响应时间。

此设置适用于可以通过表和列统计信息或LIMIT子句的存在准确确定处理的行数的查询。 如果Impala无法准确估计行数,则此设置不适用。

如果查询使用复杂数据类型STRUCT,ARRAY或MAP,则无论DISABLE_CODEGEN_ROWS_THRESHOLD设置如何,都不会自动禁用codegen。

SET DISABLE_CODEGEN_ROWS_THRESHOLD=number_of_rows

DISABLE_ROW_RUNTIME_FILTERING (default false)

DISABLE_ROW_RUNTIME_FILTERING 查询选项缩小了运行时筛选功能的范围。 查询仍然会动态修剪分区,但不会将过滤逻辑应用于分区中的各个行。仅适用于对Parquet表的查询。 对于其他文件格式,Impala仅修剪分区级别,而不是单个行。

Impala会自动评估每行过滤器是否有效减少中间数据量。 因此,通常仅在极少数情况下才需要此选项,其中Impala无法准确确定每行筛选对查询的有效性。

由于运行时筛选功能主要应用于资源密集型和长时间运行的查询,因此仅在调整涉及大型分区表和涉及大型表的联接的长时间运行查询时调整此查询选项。

由于此设置仅在特定情况下提高查询性能,具体取决于查询特征和数据分布,因此仅在通过基准测试确定它可以提高特定昂贵查询的性能时才使用它。 考虑在昂贵的查询之前设置此查询选项,然后立即取消设置。

文件格式考虑因素

此查询选项仅适用于使用Parquet文件格式对基于HDFS的表的查询。

kudu考虑因素

当应用于涉及Kudu表的查询时,此选项将关闭Kudu表的所有运行时筛选。

DISABLE_STREAMING_PREAGGREGATIONS (default false )

关闭CDH 5.7 / Impala 2.5及更高版本中提供的“streaming preaggregation”优化。

此优化减少了对具有很少或没有重复值的列执行聚合操作的查询所执行的不必要的工作,例如DISTINCT id_column或GROUP BY unique_column。如果优化导致使用聚合函数的现有查询异常,则可以根据需要将其关闭。

在CDH 5.7.0 / Impala 2.5.0中,只有值1启用该选项,无法识别值true。 IMPALA-3334 问题跟踪此限制,该问题会显示得到解决的版本。

通常,需要启用此选项的查询涉及非常大量的聚合值,例如在每个工作节点上处理十亿或更多不同的字段。

DISABLE_UNSAFE_SPILLS (default false )

如果您希望查询在超过 Impala 内存限制时失败,而不是将临时数据写入磁盘,请启用此选项。

“溢出”到磁盘的查询通常会成功完成,而在早期的Impala版本中,它们会失败。 但是,由于缺少统计信息或低效的连接子句而导致内存需求过高的查询可能变得非常慢,因此您希望自动取消它们并通过标准Impala调优技术减少内存使用量。

此选项仅防止“不安全”溢出操作,这意味着一个或多个表缺少统计信息,或者查询不包含为连接设置最有效机制或INSERT … SELECT到分区表的提示。

有关使用join,ORDER BY,GROUP BY,DISTINCT,聚合函数或分析函数处理大型结果集的查询的“溢出到磁盘”功能的信息,请参阅“溢出到磁盘的SQL操作”。

ENABLE_EXPR_REWRITES (default true )

ENABLE_EXPR_REWRITES查询选项控制是启用还是禁用查询编译时优化。 这些优化将表达式树重写为更紧凑和优化的形式,有助于避免在运行时进行冗余表达式评估。

EXEC_SINGLE_NODE_ROWS_THRESHOLD (default 100)

此设置控制截止点(根据扫描的行数),Impala将查询视为“小”查询,关闭并行执行和本机代码生成等优化。 这些优化的开销适用于涉及大量数据的查询,但跳过涉及少量数据的查询是有意义的。 减少小型查询的开销使Impala能够更快地完成它们,从而使得许可控制插槽,CPU,内存等可用于资源密集型查询。

SET EXEC_SINGLE_NODE_ROWS_THRESHOLD=number_of_rows

此设置适用于可以通过表和列统计信息或LIMIT子句的存在准确确定处理的行数的查询。如果Impala无法准确估计行数,则此设置不适用。

在CDH 5.5 / Impala 2.3及更高版本中,Impala支持复杂数据类型STRUCT,ARRAY和MAP,如果查询引用这些类型的任何列,则无论EXEC_SINGLE_NODE_ROWS_THRESHOLD设置如何,都会为该查询关闭小查询优化。

EXEC_TIME_LIMIT_S (default 0)

设置查询执行的时间限制。 如果查询在时间限制到期时仍在执行,则会自动取消。 该选项目的在于防止执行时间超过预期的失控查询。

例如,Impala管理员可以为资源池设置默认值EXEC_TIME_LIMIT_S = 3600,以自动终止执行时间超过一小时的查询。 然后,如果用户意外运行执行超过一小时的大型查询,则会在时间限制到期后自动终止以释放资源。 如果用户不希望将默认EXEC_TIME_LIMIT_S值应用于特定查询或会话,则可以覆盖每个查询或每个会话的默认值。

SET EXEC_TIME_LIMIT_S=seconds;

时间限制仅在查询执行后才开始。 计划查询,调度查询或准入控制所花费的时间不计入执行时间限制。 SELECT语句有资格自动取消,直到客户端获取了所有结果行。 在DML语句完成之前,DML查询有资格自动取消。

EXPLAIN_LEVEL(default 0)

控制EXPLAIN语句输出中提供的详细信息量。 基本输出可以帮助您识别高级性能问题,例如扫描比预期更多的数据或更多分区。 更高级别的详细信息显示了中间结果如何在节点之间流动以及如何在分布式查询中实现不同的SQL操作(如ORDER BY,GROUP BY,join和WHERE子句)。

此选项允许的数值范围是0到3:

0 or MINIMAL: 主要用于在非常长的查询中检查 join 顺序,其中常规EXPLAIN输出太长而无法轻松读取。

1 or STANDARD: 默认的详细级别,显示分布式查询的工作逻辑方式。

2 or EXTENDED: 包括有关查询计划程序如何在其决策过程中使用统计信息的其他详细信息,通过收集统计信息,使用查询提示,添加或删除谓词等来了解如何调整查询。

3 or VERBOSE: 最高级别的详细信息,显示每个节点内的“查询片段”。 这个额外的细节主要用于Impala本身内的低级性能测试和调优,而不是用于在用户级别重写SQL代码。

更改此选项的值可控制EXPLAIN语句输出中的详细信息量。 当您需要确认查询的工作是否按照您期望的方式分发时,来自级别2或级别3的扩展信息特别有用,特别是对于大多数资源密集型操作(例如针对大型表的查询,查询) 针对具有大量分区的表,以及Parquet表的插入操作。

与往常一样,从下到上阅读EXPLAIN输出。 最低行表示查询的初始工作(扫描数据文件),中间的行表示在每个节点上完成的计算以及中间结果如何从一个节点传输到另一个节点,最上面的行表示返回的最终结果 到协调器节点。

在所有EXPLAIN级别,如果查询中的任何表缺少统计信息,则计划将包含警告。 使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值