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

Etkileşimli veri iş akışlarıyla ilgili bir zorluk, büyük sorguları işlemektir. 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, işlem kaynaklarını doygun hale getirir ve başkalarının aynı işlemi paylaşmasını zor hale getirir.

Sorgu İzleme, büyük sorguların en yaygın nedenlerini inceleyerek ve eşiği geçen sorguları sonlandırarak sorguların işlem kaynaklarını tekeline almalarını engelleyen bir işlemdir. Bu makalede Sorgu İzleyicisi'nin nasıl etkinleştirileceği ve yapılandırıldığı açıklanmaktadır.

Önemli

Sorgu İzleme, kullanıcı arabirimi kullanılarak oluşturulan tüm amaçlı işlemlerde etkinleştirilir.

Kesintiye neden olan sorgu örneği

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 işlem kullanmasını kolaylaştıran paylaşılan bir otomatik ölçeklendirme işlemi kullanır. Her birinin bir milyon satırı olan 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'ta yönetilebilir. Ancak her satırda boş dize içeren bir join_key sütun bulunur. Veriler tamamen temiz değilse veya bazı anahtarların diğerlerinden daha yaygın olduğu önemli veri dengesizliği varsa bu durum oluşabilir. Bu boş birleştirme anahtarları diğer değerlerden çok daha yaygındır.

Aşağıdaki kodda analist anahtarlarında bu iki tabloyu birleştirerek bir trilyon sonuç üretir ve bunların tümü tek bir yürütücüde (anahtarı alan " " yürütücü) üretilir:

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

Bu sorgu çalışıyor gibi görünüyor. Ancak analist, veriler hakkında bilgi sahibi olmadan işi yürütme süresi boyunca tek bir görevin "yalnızca" kaldığını görür. Sorgu hiç bitmediğinden analistin neden çalışmadığı konusunda hayal kırıklığına uğramış ve kafası karışmış durumdadır.

Bu durumda tek bir sorunlu birleştirme anahtarı vardır. Bazen çok daha fazlası olabilir.

Sorgu İzleme'yi etkinleştirme ve yapılandırma

Sorgu İzleme'yi etkinleştirmek ve yapılandırmak için aşağıdaki adımlar gereklidir.

  • watchdog'yi ile spark.databricks.queryWatchdog.enabledetkinleştirin.
  • görev çalışma zamanını ile spark.databricks.queryWatchdog.minTimeSecsyapılandırın.
  • çıktıyı ile spark.databricks.queryWatchdog.minOutputRowsgörüntüleyin.
  • ile çıkış oranını spark.databricks.queryWatchdog.outputRatioThresholdyapılandırın.

Bir sorgunun giriş satırı sayısı için çok fazla çıkış satırı oluşturmasını önlemek için Sorgu İzleme'yi 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 (varsayılan) oranı kullanıyoruz.

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

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

İpucu

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

Sorgu İzleyicisi, kullanıcıların hiçbir zaman tamamlanmayacak işler için işlem kaynaklarını tekeline almasını engellemenin yanında, hiçbir zaman tamamlanmamış bir sorguyu hızlı bir şekilde başarısız yaparak da zaman kazandırır. Örneğin, aşağıdaki sorgu, oranı aştığı için birkaç dakika sonra başarısız olur.

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

Şunları görürsünüz:

Sorgu izlemesi

Sorgu İzleme'yi etkinleştirmek ve çıkış/giriş eşik oranını ayarlamak için 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 edilmeden önce çalışması gereken en düşük süreyi ve bu sorgudaki bir görevin en az çıkış satırı sayısını belirtir.

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

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

İpucu

Bir not defterinde Sorgu İzleme'yi yapılandırdığınızda, işlem yeniden başlatmalarında yapılandırma kalıcı olmaz. Bir işlemdeki tüm kullanıcılar için Sorgu İzleme'yi yapılandırmak istiyorsanız, bir işlem yapılandırması kullanmanızı öneririz.

Son derece büyük veri kümesindeki sorguyu algılama

Başka bir tipik büyük sorgu, büyük tablolardan/veri kümelerinden büyük miktarda veriyi tarayabilir. Tarama işlemi uzun sürebilir ve işlem kaynaklarını doygunluğa taşıyabilir (büyük bir Hive tablosunun meta verilerini okumak bile önemli miktarda zaman alabilir). Büyük bir Hive tablosundan çok fazla bölüm getirmeyi önlemek için ayarlayabilirsiniz maxHivePartitions . Benzer şekilde, son derece büyük bir veri kümesindeki sorguları sınırlamak için de ayarlayabilirsiniz maxQueryTasks .

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

Sorgu İzleme'yi ne zaman etkinleştirmeniz gerekir?

SQL analistlerinin ve veri bilimcilerinin belirli bir işlem paylaştığı geçici analiz işlemleri için Sorgu İzleme etkinleştirilmelidir ve bir yöneticinin sorguların birbiriyle "düzgün" çalıştığından emin olması gerekir.

Sorgu İzleme'yi ne zaman devre dışı bırakmalısınız?

Genel olarak, bir ETL senaryosunda kullanılan sorguların hevesle iptal edilmesi önerilmez çünkü genellikle hatayı düzeltmek için döngüde bir insan yoktur. Geçici analiz işlemleri dışında tüm işlemlerde Sorgu İzleme'yi devre dışı bırakmanızı öneririz.