Delen via


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:

Query-watchdog

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.