Etkileşimli iş akışlarında büyük sorguları işleme

Etkileşimli veri iş akışlarıyla bir zorluk, büyük sorguları işliyor. Bu çok fazla sayıda çıkış satırı oluşturan, birçok dış bölümü getiren veya aşırı büyük veri kümelerinde işlem yapan sorguları da içeriyor. Bu sorgular son derece yavaş olabilir, küme kaynaklarını doldurabilir ve başkalarının aynı kümeyi paylaşmasını zorlaştırabilir.

Sorgu Izleme, büyük sorguların en yaygın nedenlerini inceleyerek ve bir eşiği geçen sorguları sonlandırarak, sorguların küme kaynaklarını tekeline almasını önleyen bir işlemdir. Bu makalede sorgu Izleyicisi 'nin nasıl etkinleştirileceği ve yapılandırılacağı açıklanmaktadır.

Önemli

Sorgu Izleme, Kullanıcı arabirimi kullanılarak oluşturulan tüm tüm amaç kümeleri için etkinleştirilmiştir.

Kesintiye uğramayan bir sorgu örneği

Bir analist, tam zamanında veri ambarında bazı geçici sorgular gerçekleştiriyor. Analist, birden çok kullanıcının aynı anda tek bir küme kullanmasını kolaylaştıran paylaşılan bir otomatik ölçeklendirme kümesi kullanır. Her birinin milyon satıra sahip iki tablo olduğunu varsayalım.

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")

Bu tablo boyutları Apache Spark yönetilebilir. Ancak, her join_key birinde her satırda boş bir dize içeren bir sütun bulunur. Bu durum, verilerin kusursuz bir şekilde temiz olmaması veya bazı anahtarların diğerlerinden daha yaygın olduğu önemli veri eğriliği olması durumunda gerçekleşebilir. Bu boş ekleme anahtarları diğer bir değerden daha yaygın olarak bulunur.

Aşağıdaki kodda analist bu iki tabloyu anahtarları üzerinde birleştiriyorsa, bu iki tablo 1.000.000.000.000 sonuçların çıkışını üretir ve bunların tümü tek bir yürütücü üzerinde oluşturulur (anahtarı alan yürütücü " " ):

SELECT
  id, count()
FROM
  (SELECT
    x.id
  FROM
    table_x x
  JOIN
    table_y y
  on x.join_key = y.join_key)
GROUP BY id

Bu sorgu çalışıyor gibi görünüyor. Ancak, veriler hakkında bilgi sahibi olmadan analist, işin yürütülmesi sırasında yalnızca tek bir görevin "yalnızca" bulunduğunu görür. Sorgu hiçbir şekilde bitmediği, analistinin neden çalışmadığına dair kafa karıştı.

Bu durumda yalnızca bir sorunlu bir JOIN anahtarı vardır. Diğer süreler da çok daha fazla olabilir.

Sorgu Izleme 'yi etkinleştirme ve yapılandırma

Bir sorgunun giriş satırı sayısı için çok fazla sayıda çıkış satırı oluşturmasını engellemek için, sorgu Izleyicisi 'ni etkinleştirebilir ve en fazla çıkış satırı sayısını giriş satırı sayısının katı olarak yapılandırabilirsiniz. Bu örnekte, 1000 oranını (varsayılan) kullanacağız.

spark.conf.set("spark.databricks.queryWatchdog.enabled", true)
spark.conf.set("spark.databricks.queryWatchdog.outputRatioThreshold", 1000L)

İkinci yapılandırma, belirli bir görevin giriş satırı sayısının 1000 ' den fazla kez hiçbir zaman üretmemesi gerektiğini bildirir.

İpucu

Çıkış oranı tamamen özelleştirilebilir. Daha düşük bir başlangıç yapmanızı ve hangi eşiğin sizin ve ekibiniz için uygun olduğunu görmenizi öneririz. 1.000 ile 10.000 arasında bir Aralık, iyi bir başlangıç noktasıdır.

Yalnızca sorgu Izleme, kullanıcıların, hiçbir zaman tamamlanmayacak işler için küme kaynaklarını tekeline almasını önleyememesi, aynı zamanda tamamlanmamış bir sorgu hızlı bir şekilde başarısız olacak şekilde zaman kazandırır. Örneğin, aşağıdaki sorgu, oranı aştığından birkaç dakika sonra başarısız olur.

SELECT
  join_key,
  sum(x.id),
  count()
FROM
  (SELECT
    x.id,
    y.join_key
  FROM
    table_x x
  JOIN
    table_y y
  on x.join_key = y.join_key)
GROUP BY join_key

Şunları göreceksiniz:

Sorgu izleme

Sorgu Izleyicisi 'ni etkinleştirmek ve çıkış/giriş eşiği oranını ayarlamak genellikle yeterlidir, ancak iki ek özellik ayarlama seçeneğiniz de vardır: spark.databricks.queryWatchdog.minTimeSecs ve spark.databricks.queryWatchdog.minOutputRows . Bu özellikler, bir sorgudaki belirli bir görevin iptal etmeden önce çalıştırılması gereken en kısa süreyi ve bu sorgudaki bir görev için en az sayıda çıkış satırını belirtir.

Örneğin, minTimeSecs görev başına çok sayıda satır üretme şansı vermek istiyorsanız, daha yüksek bir değere ayarlayabilirsiniz. Benzer şekilde, spark.databricks.queryWatchdog.minOutputRows bir sorguyu yalnızca bu sorgudaki bir görev 10.000.000 satır üretduktan sonra durdurmak istiyorsanız 10.000.000 olarak ayarlayabilirsiniz. Çıkış/giriş oranı aşılsa bile, daha az bir şey ve sorgu başarılı olur.

spark.conf.set("spark.databricks.queryWatchdog.minTimeSecs", 10L)
spark.conf.set("spark.databricks.queryWatchdog.minOutputRows", 100000L)

İpucu

Sorgu Izleme 'yi bir not defterinde yapılandırırsanız, yapılandırma küme yeniden başlatmaları arasında kalıcı olmaz. Sorgu Izleme 'yi bir kümenin tüm kullanıcıları için yapılandırmak istiyorsanız, bir küme yapılandırmasıkullanmanızı öneririz.

Son derece büyük veri kümesinde sorguyu Algıla

Diğer tipik büyük bir sorgu, büyük tablolardaki/veri kümelerinden büyük miktarda veriyi tarayacaktır. Tarama işlemi uzun bir süre sürebilir ve küme kaynaklarının boyutunu (büyük bir Hive tablosunun meta verilerinin okunması önemli miktarda zaman alabilir). maxHivePartitionsBüyük bir Hive tablosundan çok fazla bölüm getirmeyi engellemek için ayarı yapabilirsiniz. Benzer şekilde, maxQueryTasks çok büyük bir veri kümesinde sorguları sınırlandırmaya de ayarlayabilirsiniz.

spark.conf.set("spark.databricks.queryWatchdog.maxHivePartitions", 20000)
spark.conf.set("spark.databricks.queryWatchdog.maxQueryTasks", 20000)

Sorgu Izleme 'yi ne zaman etkinleştirmeniz gerekir?

SQL analistlerinin ve veri bilimcilerinin belirli bir kümeyi paylaştığı ve bir yöneticinin bir yöneticinin "düzgün şekilde" oynamasından emin olması için bir yönetici olması gereken geçici analiz kümeleri için sorgu izleme etkinleştirilmelidir.

Sorgu Izleme 'yi ne zaman devre dışı bırakmanız gerekir?

Genel olarak, bir ETL senaryosunda kullanılan sorguları genellikle hatayı düzeltmek için bir insan olmadığından, bir ETL senaryosunda kullanılan sorguları iptal etmedik. Her türlü geçici analiz kümesi için sorgu Izleme 'yi devre dışı bırakmanızı öneririz.