Birçok kıvılcım işi eşzamanlı olarak zamanlandığında kilitlenme


17

Kıvılcım FIFO zamanlayıcı ile YARN küme modunda çalışan kıvılcım 2.4.4 kullanma.

Değişken sayıda iş parçacığı havuzu yürütücü kullanarak birden çok kıvılcım veri çerçevesi işlemleri (yani veri S3 yazma) gönderiyorum. ~ 10 iş parçacığım varsa bu iyi çalışır, ancak yüzlerce iş parçacığı kullanırsam, Spark UI'ye göre hiçbir iş planlanmadan bir kilitlenme var gibi görünüyor.

Aynı anda kaç işin planlanabileceğini hangi faktörler kontrol eder? Sürücü kaynakları (örneğin bellek / çekirdekler)? Diğer kıvılcım yapılandırma ayarları?

DÜZENLE:

İşte kodumun kısa bir özeti

ExecutorService pool = Executors.newFixedThreadPool(nThreads);
ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool);

Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths);

List<Future<Void>> futures = listOfSeveralHundredThings
  .stream()
  .map(aThing -> ecs.submit(() -> {
    df
      .filter(col("some_column").equalTo(aThing))
      .write()
      .format("org.apache.hudi")
      .options(writeOptions)
      .save(outputPathFor(aThing));
    return null;
  }))
  .collect(Collectors.toList());

IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES));
exec.shutdownNow();

Bir noktada, nThreadsarttıkça, kıvılcım artık herhangi bir işi planladığı gibi planlamıyor gibi görünüyor:

  • ecs.poll(...) sonunda zaman aşımı
  • Etkin iş olmadığını gösteren Spark UI işler sekmesi
  • Herhangi bir yürütücü için etkin görev göstermeyen Spark UI yürütücüler sekmesi
  • nThreadsÇalışan iş kimliği olmayan çalışan sorguları gösteren Spark UI SQL sekmesi

Yürütme ortamım

  • AWS EMR 5.28.1
  • Kıvılcım 2.4.4
  • Ana düğüm = m5.4xlarge
  • Çekirdek düğümler = 3x rd5.24xlarge
  • spark.driver.cores=24
  • spark.driver.memory=32g
  • spark.executor.memory=21g
  • spark.scheduler.mode=FIFO


Bunu tartışan belirli bir bölüm var mı? Son birkaç gün içinde bu dokümanları birkaç kez okudum ve aradığım yanıtı bulamadım.
Scott

2
Lütfen iş parçacığı havuzu yürütücüsü aracılığıyla Spark işlerini göndermek için kullandığınız kodu gösterebilir misiniz? Spark işi gönderilmeden önce çıkmaza giriyor gibi görünüyor.
Salim

1
Kodunuzu gönderebilir misiniz? Lütfen env'nizle ilgili ayrıntıları sağlayın: CPU, RAM; ayrıca konuları nasıl oluşturuyorsunuz: aynı anda mı yoksa 10 kişilik küçük gruplar halinde mi?
Saheed

Maalesef, işlerin planlanmadığını nasıl kastediyorsunuz? Spark kullanıcı arayüzünde görünmüyorlar veya işler listesinde görünüyorlar, ancak görevler yürütülmüyor mu? Her iki durumda da, bir kilitlenmeden şüpheleniyorsanız, jstack -lkilitleme bilgileri içeren bir iplik dökümü almak için lütfen çalıştırın .
Daniel Darabos

Yanıtlar:


0

Mümkünse işlerin çıktısını AWS Elastik MapReduce hdfs'ye yazın (neredeyse anlık yeniden adlandırmalardan ve yerel hdfs'nin daha iyi dosya IO'sundan faydalanmak için) ve dosyaları S3'e taşımak için kendinizi bir dstcp adımı ekleyin. dosya sistemi olmaya çalışan bir nesne deposunun iç kısımları. Ayrıca yerel hdfs'ye yazmak, DirectOutputCommiter ile ilişkili kilitlenme tuzaklarına düşmeden kaçak görevleri kontrol etmek için spekülasyonu etkinleştirmenize izin verecektir.

Çıkış dizini olarak S3 kullanmanız gerekiyorsa, aşağıdaki Spark yapılandırmalarının ayarlandığından emin olun

spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
spark.speculation false

Not: DirectParquetOutputCommitter, veri kaybı olasılığı nedeniyle Spark 2.0'dan kaldırılmıştır. Ne yazık ki S3a'nın tutarlılığını geliştirene kadar geçici çözümlerle çalışmak zorundayız. Hadoop 2.8 ile işler düzeliyor

Sözcük adlarını sırayla kullanmaktan kaçının. Biri, karma / rastgele önekleri veya ters tarih-zamanı kullanabilir, hile anahtarlarınızı hiyerarşik olarak adlandırmak ve filtrelediğiniz en yaygın şeyleri anahtarınızın sol tarafına koymaktır. Ve DNS sorunları nedeniyle hiçbir zaman grup adlarında alt çizgi bulunmaz.

etkinleştirilmesi fs.s3a.fast.upload uploadTek bir dosyanın parçalarını paralel olarak Amazon S3'e

Daha fazla ayrıntı için bu makalelere bakın.

S3'e yazarken Spark 2.1.0'da kıvılcım belirtimini ayarlama

https://medium.com/@subhojit20_27731/apache-spark-and-amazon-s3-gotchas-and-best-practices-a767242f3d98



0

IMO muhtemelen bu soruna yanlış yaklaşıyorsunuz. İş başına görev sayısının çok düşük olduğunu garanti edemezseniz, 100'lü işi aynı anda paralel hale getirerek performansta çok fazla iyileşme elde edemezsiniz. 200'lük varsayılan paralellik kullandığınızı varsayarsak, kümeniz aynı anda yalnızca 300 görevi destekleyebilir. Ben 10'da maksimum eşzamanlı sorguları kap için kodunuzu yeniden yazmayı öneriyorum. Ben gerçekten çalışan birkaç yüz tek bir görev ile 300 sorgu olduğundan şüpheleniyorum. Çoğu OLTP veri işleme sistemi, bu nedenle daha geleneksel RDS sistemlerine kıyasla kasıtlı olarak düşük eşzamanlı sorgu düzeyine sahiptir.

Ayrıca

  1. Apache Hudi'nin birkaç yüz FYI varsayılan paralelliğine sahiptir.
  2. Neden sadece filtre sütununuza göre bölümleme yapmıyorsunuz?
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.