开始
加载和管理数据
处理数据
政府
参考和资源
2023年2月22日更新
给我们反馈
交互式数据工作流的一个挑战是处理大型查询。这包括生成太多输出行、获取太多外部分区或在超大数据集上计算的查询。这些查询可能非常慢,使集群资源饱和,并使其他人难以共享同一集群。
查询看门狗是一个通过检查大型查询的最常见原因和终止超过阈值的查询来防止查询垄断集群资源的过程。本文介绍如何启用和配置查询看门狗。
重要的
通过UI创建的所有通用集群都开启了“查询看门狗”。
分析师正在即时数据仓库中执行一些特别查询。分析师使用共享的自动伸缩集群,这使得多个用户可以很容易地同时使用单个集群。假设有两个表,每个表有一百万行。
进口org.apache.火花.sql.功能._火花.相依.集(“spark.sql.shuffle.partitions”,10)火花.范围(1000000).withColumn(“join_key”,点燃(”“)).createOrReplaceTempView(“出现”)火花.范围(1000000).withColumn(“join_key”,点燃(”“)).createOrReplaceTempView(“table_y”)
这些表大小在Apache Spark中是可管理的。但是,它们都包含一个join_key列,每一行中都有一个空字符串。如果数据不是完全干净,或者存在明显的数据倾斜(某些键比其他键更普遍),就会发生这种情况。这些空连接键比任何其他值都普遍得多。
join_key
在下面的代码中,分析人员将这两个表的键连接在一起,从而产生的输出一万亿结果,所有这些都是在一个执行程序上生成的(该执行程序获得""键):
""
选择id,数(id)从(选择x.id从出现x加入table_yy在x.join_key=y.join_key)集团通过id
该查询似乎正在运行。但是在不了解数据的情况下,分析人员看到在执行作业的过程中“只剩下”一个任务。查询永远不会结束,让分析人员感到沮丧和困惑,不知道为什么它不起作用。
在这种情况下,只有一个有问题的连接键。其他时候可能更多。
开启并配置查询看门狗,需要执行以下步骤。
启用看门狗spark.databricks.queryWatchdog.enabled.
spark.databricks.queryWatchdog.enabled
配置任务运行时spark.databricks.queryWatchdog.minTimeSecs.
spark.databricks.queryWatchdog.minTimeSecs
显示输出spark.databricks.queryWatchdog.minOutputRows.
spark.databricks.queryWatchdog.minOutputRows
配置输出比spark.databricks.queryWatchdog.outputRatioThreshold.
spark.databricks.queryWatchdog.outputRatioThreshold
为了避免查询时输出行数超过输入行数,可以启用“查询看门狗”,并将最大输出行数配置为输入行数的倍数。在这个例子中,我们使用的比率是1000(默认值)。
火花.相依.集(“spark.databricks.queryWatchdog.enabled”,真正的)火花.相依.集(“spark.databricks.queryWatchdog.outputRatioThreshold”,1000升)
后一种配置声明,任何给定任务产生的输入行数都不应超过1000倍。
提示
输出比例是完全可定制的。我们建议从较低的门槛开始,看看什么门槛对你和你的团队最有效。1000到10,000的范围是一个很好的起点。
Query Watchdog不仅可以防止用户为永远不会完成的作业垄断集群资源,还可以通过快速失败永远不会完成的查询来节省时间。例如,以下查询将在几分钟后失败,因为它超过了该比率。
选择z.idjoin_key,总和(z.id),数(z.id)从(选择x.id,y.join_key从出现x加入table_yy在x.join_key=y.join_key)z集团通过join_key,z.id
以下是你将看到的:
通常启用查询看门狗并设置输出/输入阈值比就足够了,但你也可以选择设置两个额外的属性:spark.databricks.queryWatchdog.minTimeSecs而且spark.databricks.queryWatchdog.minOutputRows.这些属性指定查询中给定任务在取消它之前必须运行的最短时间,以及该查询中任务的最小输出行数。
例如,您可以设置minTimeSecs如果您想让它有机会为每个任务生成大量行,则将其转换为更高的值。同样,你可以设置spark.databricks.queryWatchdog.minOutputRows如果希望仅在查询中的某个任务产生了1000万行之后才停止查询,则可以将其设置为1000万行。小于此值则查询成功,即使超出了输出/输入比。
minTimeSecs
火花.相依.集(“spark.databricks.queryWatchdog.minTimeSecs”,10 l)火花.相依.集(“spark.databricks.queryWatchdog.minOutputRows”,100000 l)
如果在笔记本中配置了查询看门狗,则该配置不会在集群重新启动时保持不变。如果您想为集群中的所有用户配置查询看门狗,我们建议您使用集群配置.
另一个典型的大型查询可能会扫描来自大型表/数据集的大量数据。扫描操作可能会持续较长时间,导致集群资源饱和(即使是读取大Hive表的元数据也会花费大量时间)。你可以设置maxHivePartitions以防止从一个大的Hive表中获取太多分区。同样,您也可以设置maxQueryTasks限制对超大数据集的查询。
maxHivePartitions
maxQueryTasks
火花.相依.集(“spark.databricks.queryWatchdog.maxHivePartitions”,20000)火花.相依.集(“spark.databricks.queryWatchdog.maxQueryTasks”,20000)
应该为临时分析集群启用查询看门狗,在这些集群中,SQL分析师和数据科学家共享一个给定的集群,管理员需要确保查询彼此“良好地发挥”。
一般来说,我们不建议立即取消ETL场景中使用的查询,因为循环中通常没有人来纠正错误。我们建议您禁用查询看门狗,但ad hoc分析集群。