Apache Spark: yeniden bölümlendirme, sıralama ve önbelleğe almanın birleştirme üzerindeki etkisi


10

Kendine bir masaya katılırken Spark'ın davranışını araştırıyorum. Veritabanları kullanıyorum.

Kukla senaryom:

  1. Harici bir tabloyu veri çerçevesi A olarak okuyun (temel alınan dosyalar delta biçimindedir)

  2. Veri çerçevesi B'yi yalnızca belirli sütunlar seçili olarak veri çerçevesi A olarak tanımlayın

  3. Sütun1 ve sütun2'deki A ve B veri çerçevelerine katılın

(Evet, pek mantıklı değil, sadece Spark'ın temelindeki mekaniği anlamaya çalışıyorum)

a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))

b = a.select("column1", "column2", "columnA")

c= a.join(b, how="left", on = ["column1", "column2"])

İlk denemem kodu olduğu gibi çalıştırmaktı (deneme 1). Sonra yeniden bölümlemeye ve önbelleğe almaya çalıştım (deneme 2)

a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).cache()

Sonunda, bölümlere ayırdım, sıraladım ve önbelleğe aldım

 a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).sortWithinPartitions(col("column1"), col("column2")).cache()

Oluşturulan ilgili hatalar ektedir.

Sorularım:

  1. Neden deneme 1'de önbellek açıkça belirtilmemiş olsa da tablo önbelleğe alınmış gibi görünüyor.

  2. Neden InMemoreTableScan'ı her zaman bu tür başka bir düğüm izler.

  3. Neden denemede 3 önbellekleme iki aşamada gerçekleşiyor?

  4. Neden girişim 3 WholeStageCodegen bir (ve sadece bir) InMemoreTableScan izler.

deneme 1

deneme 2

resim açıklamasını buraya girin


Kaynak harici bir tablo olduğunda DataFrame okuyucunun verileri otomatik olarak önbelleğe aldığından şüpheleniyorum. Ben bir veritabanı tablosundan veri okurken benzer bir durum var, mümkün iken 'Uygulama detay UI' "SQL" sekmesi indirilen satır sayısını gösterir ama henüz belirtilen yerde hiçbir dosya kaydedildi gösterir . Sanırım sayıyı biliyor çünkü verileri bir yerde önbelleğe alıyor ve DAG'da görünen şey bu. Bir metin dosyasından yerel olarak veri okursanız, önbellek durumunu görmezsiniz.
Salim

Yanıtlar:


4

Bu 3 planda gözlemlediğiniz, DataBricks çalışma zamanı ve Spark'ın bir karışımı.

Her şeyden önce, DataBricks runtime 3.3+ çalıştırırken, tüm parke dosyaları için önbellekleme otomatik olarak etkinleştirilir. Bunun için ilgili yapılandırma: spark.databricks.io.cache.enabled true

İkinci sorgunuz için, InMemoryTableScan iki kez oluyor , çünkü birleştirme çağrıldığında hemen kıvılcım Veri Kümesi A ve Veri Kümesi B'yi paralel olarak hesaplamaya çalıştı. Farklı yöneticilerin yukarıdaki görevleri atadığı varsayılarak, her ikisinin de tabloyu (DataBricks) önbelleğinden taraması gerekecektir.

Üçüncüsü için, InMemoryTableScan kendi içinde önbelleğe almayı ifade etmez. Sadece hangi plan katalizörü oluşursa önbelleğe alınmış tablonun birden çok kez taranması anlamına gelir.

Not: 4. noktayı görselleştiremiyorum :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.