Omgaan met grote query's in interactieve werkstromen
Een uitdaging met interactieve gegevenswerkstromen is het verwerken van grote query's. Dit omvat query's die te veel uitvoerrijen genereren, veel externe partities ophalen of berekeningen uitvoeren op extreem grote gegevenssets. Deze query's kunnen extreem traag zijn, verzadiging van rekenresources en het voor anderen moeilijk maken om dezelfde berekening te delen.
Query Watchdog is een proces dat voorkomt dat query's rekenresources in beslag nemen door de meest voorkomende oorzaken van grote query's te onderzoeken en query's te beëindigen die een drempelwaarde passeren. In dit artikel wordt beschreven hoe u Query Watchdog inschakelt en configureert.
Belangrijk
Query Watchdog is ingeschakeld voor alle berekeningen voor alle doeleinden die zijn gemaakt met behulp van de gebruikersinterface.
Voorbeeld van een verstorende query
Een analist voert enkele ad-hocquery's uit in een Just-In-Time-datawarehouse. De analist maakt gebruik van een gedeelde automatische schaalaanpassing waarmee meerdere gebruikers eenvoudig één rekenproces tegelijk kunnen gebruiken. Stel dat er twee tabellen zijn met elk een miljoen rijen.
import org.apache.spark.sql.functions._
spark.conf.set("spark.sql.shuffle.partitions", 10)
spark.range(1000000)
.withColumn("join_key", lit(" "))
.createOrReplaceTempView("table_x")
spark.range(1000000)
.withColumn("join_key", lit(" "))
.createOrReplaceTempView("table_y")
Deze tabelgrootten kunnen worden beheerd in Apache Spark. Ze bevatten echter elk een join_key
kolom met een lege tekenreeks in elke rij. Dit kan gebeuren als de gegevens niet perfect schoon zijn of als er sprake is van aanzienlijke scheeftrekken van gegevens waarbij sommige sleutels vaker voorkomen dan andere. Deze lege joinsleutels komen veel vaker voor dan elke andere waarde.
In de volgende code voegt de analist deze twee tabellen samen op hun sleutels, die de uitvoer van één biljoen resultaten produceert, en al deze worden geproduceerd op één uitvoerprogramma (de uitvoerder die de " "
sleutel ophaalt):
SELECT
id, count(id)
FROM
(SELECT
x.id
FROM
table_x x
JOIN
table_y y
on x.join_key = y.join_key)
GROUP BY id
Deze query lijkt te worden uitgevoerd. Maar zonder te weten over de gegevens, ziet de analist dat er 'slechts' één taak overblijft tijdens het uitvoeren van de taak. De query is nooit voltooid, waardoor de analist gefrustreerd en verward is over waarom de query niet werkte.
In dit geval is er slechts één problematische joinsleutel. Andere keren kan er nog veel meer zijn.
Query Watchdog inschakelen en configureren
Als u Query Watchdog wilt inschakelen en configureren, zijn de volgende stappen vereist.
- Schakel Watchdog in met
spark.databricks.queryWatchdog.enabled
. - Configureer de taakruntime met
spark.databricks.queryWatchdog.minTimeSecs
. - Uitvoer weergeven met
spark.databricks.queryWatchdog.minOutputRows
. - Configureer de uitvoerverhouding met
spark.databricks.queryWatchdog.outputRatioThreshold
.
Als u wilt voorkomen dat een query te veel uitvoerrijen maakt voor het aantal invoerrijen, kunt u Query Watchdog inschakelen en het maximum aantal uitvoerrijen configureren als een veelvoud van het aantal invoerrijen. In dit voorbeeld gebruiken we een verhouding van 1000 (de standaardinstelling).
spark.conf.set("spark.databricks.queryWatchdog.enabled", true)
spark.conf.set("spark.databricks.queryWatchdog.outputRatioThreshold", 1000L)
De laatste configuratie geeft aan dat een bepaalde taak nooit meer dan 1000 keer het aantal invoerrijen mag produceren.
Tip
De uitvoerverhouding kan volledig worden aangepast. We raden u aan lager te beginnen en te zien welke drempelwaarde goed werkt voor u en uw team. Een bereik van 1.000 tot 10.000 is een goed uitgangspunt.
Query Watchdog voorkomt niet dat gebruikers rekenresources kunnen in beslag maken voor taken die nooit worden voltooid, maar bespaart ook tijd door een query die nooit zou zijn voltooid snel uit te voeren. De volgende query mislukt bijvoorbeeld na enkele minuten omdat deze de verhouding overschrijdt.
SELECT
z.id
join_key,
sum(z.id),
count(z.id)
FROM
(SELECT
x.id,
y.join_key
FROM
table_x x
JOIN
table_y y
on x.join_key = y.join_key) z
GROUP BY join_key, z.id
Dit is wat u zou zien:
Het is meestal voldoende om Query Watchdog in te schakelen en de drempelwaarde voor uitvoer/invoer in te stellen, maar u hebt ook de mogelijkheid om twee extra eigenschappen in te stellen: spark.databricks.queryWatchdog.minTimeSecs
en spark.databricks.queryWatchdog.minOutputRows
. Deze eigenschappen geven de minimale tijd op waarop een bepaalde taak in een query moet worden uitgevoerd voordat deze wordt geannuleerd en het minimale aantal uitvoerrijen voor een taak in die query.
U kunt bijvoorbeeld instellen minTimeSecs
op een hogere waarde als u deze een kans wilt geven om een groot aantal rijen per taak te produceren. U kunt ook instellen spark.databricks.queryWatchdog.minOutputRows
op tien miljoen als u een query alleen wilt stoppen nadat een taak in die query tien miljoen rijen heeft geproduceerd. Alles minder en de query slaagt, zelfs als de uitvoer-/invoerverhouding is overschreden.
spark.conf.set("spark.databricks.queryWatchdog.minTimeSecs", 10L)
spark.conf.set("spark.databricks.queryWatchdog.minOutputRows", 100000L)
Tip
Als u Query Watchdog in een notebook configureert, blijft de configuratie niet behouden tijdens het opnieuw opstarten van de berekening. Als u Query Watchdog wilt configureren voor alle gebruikers van een rekenproces, raden we u aan een rekenconfiguratie te gebruiken.
Query detecteren op extreem grote gegevensset
Een andere typische grote query kan een grote hoeveelheid gegevens uit grote tabellen/gegevenssets scannen. De scanbewerking kan lang duren en verzadigingsresources bevatten (zelfs het lezen van metagegevens van een grote Hive-tabel kan veel tijd in beslag nemen). U kunt instellen maxHivePartitions
dat te veel partities uit een grote Hive-tabel worden opgehaald. Op dezelfde manier kunt u ook instellen dat query's voor een extreem grote gegevensset worden beperkt maxQueryTasks
.
spark.conf.set("spark.databricks.queryWatchdog.maxHivePartitions", 20000)
spark.conf.set("spark.databricks.queryWatchdog.maxQueryTasks", 20000)
Wanneer moet u Query Watchdog inschakelen?
Query Watchdog moet worden ingeschakeld voor ad-hocanalyse-berekening waarbij SQL-analisten en gegevenswetenschappers een bepaalde berekening delen en een beheerder ervoor moet zorgen dat query's 'mooi worden afgespeeld' met elkaar.
Wanneer moet u Query Watchdog uitschakelen?
Over het algemeen adviseren we niet graag query's te annuleren die worden gebruikt in een ETL-scenario, omdat er meestal geen mens in de lus is om de fout te corrigeren. We raden u aan Query Watchdog uit te schakelen voor alle, maar ad-hoc analyse-rekenkracht.