Apache Spark Executor belleği nasıl ayarlanır


128

Apache kıvılcım yürütme düğümleri için kullanılabilir belleği nasıl artırabilirim?

Apache Spark'a yüklenmeye uygun 2 GB'lık bir dosyam var. Şu an 1 makinede apache spark çalıştırıyorum, bu yüzden sürücü ve uygulayıcı aynı makinede. Makinenin 8 GB belleği vardır.

Belleğe alınacak dosyayı ayarladıktan sonra dosyanın satırlarını saymayı denediğimde şu hataları alıyorum:

2014-10-25 22:25:12 WARN  CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.

Ben belgelerine baktım burada ve set spark.executor.memoryiçin 4gde$SPARK_HOME/conf/spark-defaults.conf

UI, bu değişkenin Spark Ortamında ayarlandığını gösterir. Ekran görüntüsünü burada bulabilirsiniz

Ancak Executor sekmesine gittiğimde, tek Executor'umun hafıza limiti hala 265.4 MB olarak ayarlandı. Ben de hala aynı hatayı alıyorum.

Burada bahsedilen çeşitli şeyleri denedim ama yine de hatayı alıyorum ve ayarı nerede değiştirmem gerektiği konusunda net bir fikrim yok.

Kodumu kıvılcım kabuğundan etkileşimli olarak çalıştırıyorum

Yanıtlar:


185

Spark'ı yerel modda çalıştırdığınız için spark.executor.memory, fark ettiğiniz gibi ayarın herhangi bir etkisi olmayacaktır. Bunun nedeni, İşçinin spark-shell'i başlattığınızda başlattığınız sürücü JVM işlemi içinde "yaşaması" ve bunun için kullanılan varsayılan belleğin 512M olmasıdır . Bunu spark.driver.memorydaha yüksek bir şeye, örneğin 5g'ye ayarlayarak artırabilirsiniz . Bunu şu şekilde yapabilirsiniz:

  • özellikler dosyasında ayarlama (varsayılan $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • veya çalışma zamanında konfigürasyon ayarı sağlayarak

    $ ./bin/spark-shell --driver-memory 5g
    

Bunun uygulamada ayarlanmasıyla elde edilemeyeceğini unutmayın, çünkü o zamana kadar zaten çok geç, işlem zaten bir miktar bellekle başlamıştır.

Nedeni 265.4 MB bu Kıvılcım olan ayırır spark.storage.memoryFraction * spark.storage.safetyFraction depolama belleğinin toplam miktarı ve varsayılan olarak onlar 0.6 ve 0.9 bulunmaktadır.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Bu nedenle, sürücü belleğinin tamamının RDD depolaması için kullanılamayacağını unutmayın.

Ancak bunu bir küme üzerinde çalıştırmaya başladığınızda, spark.executor.memorySpark'ın bellek önbelleğine ayrılacak miktarı hesaplarken ayar devreye girecektir.


1
5g, 5Gb'ye eşdeğer midir?
Chuck

@Chuck spark.apache.org/docs/latest/… "Sürücü işlemi için kullanılacak bellek miktarı, yani SparkContext'in başlatıldığı yerde, boyut birimi sonekine sahip JVM bellek dizeleriyle aynı biçimde (" k "," m "," g "veya" t ") (ör. 512m, 2g)."
James Moore

39

Ayrıca, yerel mod için jvm'yi başlatmadan önce sürücü belleği miktarını ayarlamanız gerektiğini unutmayın:

bin/spark-submit --driver-memory 2g --class your.class.here app.jar

Bu, JVM'yi varsayılan 512M yerine 2G ile başlatacaktır.
Ayrıntılar burada :

Yerel mod için yalnızca bir uygulayıcıya sahipsiniz ve bu yürütücü sizin sürücünüzdür, bu nedenle bunun yerine sürücünün belleğini ayarlamanız gerekir. * Bununla birlikte, yerel modda, spark-submit'u çalıştırdığınızda, varsayılan bellek ayarlarıyla bir JVM zaten başlatılmıştır, bu nedenle, conf'inizde "spark.driver.memory" ayarının aslında sizin için hiçbir şey yapmayacağı anlamına gelir. Bunun yerine, aşağıdaki gibi spark-submit çalıştırmanız gerekir


5

Görünüşe göre, soru hiçbir zaman iplik üzerinde değil yerel modda çalışmamayı söylemiyor. Bir şekilde spark-default.conf değişikliğini işe alamadım. Bunun yerine bunu denedim ve benim için çalıştı

bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g

(yürütme belleğini 8g'ye çarptıramadı, iplik yapılandırmasında bazı kısıtlamalar var.)


OP, tek bir makine kullandığından bahsetmektedir.
Sharique Abdullah

Daha executor-memoryyüksek driver-memorymi yapıyorsun ?
nimeresam

5

Grega'nın verdiği cevap sorunumu çözmeme yardımcı oldu. Spark'ı bir Docker kapsayıcısı içindeki bir python betiğinden yerel olarak çalıştırıyorum. Başlangıçta, Spark'ta bazı verileri işlerken Java yetersiz bellek hatası alıyordum. Ancak, komut dosyama aşağıdaki satırı ekleyerek daha fazla bellek atayabildim:

conf=SparkConf()
conf.set("spark.driver.memory", "4g") 

Spark'ı başlatmak için kullandığım python betiğinin tam bir örneği:

import os
import sys
import glob

spark_home = '<DIRECTORY WHERE SPARK FILES EXIST>/spark-2.0.0-bin-hadoop2.7/'
driver_home = '<DIRECTORY WHERE DRIVERS EXIST>'

if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = spark_home 

SPARK_HOME = os.environ['SPARK_HOME']

sys.path.insert(0,os.path.join(SPARK_HOME,"python"))
for lib in glob.glob(os.path.join(SPARK_HOME, "python", "lib", "*.zip")):
    sys.path.insert(0,lib);

from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext

conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")
conf.set("spark.cores.max", "2")
conf.set("spark.driver.extraClassPath",
    driver_home+'/jdbc/postgresql-9.4-1201-jdbc41.jar:'\
    +driver_home+'/jdbc/clickhouse-jdbc-0.1.52.jar:'\
    +driver_home+'/mongo/mongo-spark-connector_2.11-2.2.3.jar:'\
    +driver_home+'/mongo/mongo-java-driver-3.8.0.jar') 

sc = SparkContext.getOrCreate(conf)

spark = SQLContext(sc)

4

Sürücü belleğini artırmanız gerekir. Mac'ta (yani yerel ana bilgisayarda çalışırken), varsayılan sürücü belleği 1024M'dir). Varsayılan olarak, 380 Mb, uygulayıcıya tahsis edilmiştir.

Ekran görüntüsü

[ --Driver-memory 2G ] artırıldığında, yürütme belleği ~ 950Mb'ye yükseldi. görüntü açıklamasını buraya girin


2

spark / conf dizininde spark-env.sh adlı bir dosya oluşturun ve bu satırı ekleyin

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor

1
Aynen, ustayı somut yapılandırma ile çalıştırıyorum, her kıvılcım komutu çalıştırdığımda seçenekler eklemem gerekmiyor. Ancak bu, ayarın bağımsız olması durumunda yalnızca küme düğümü içindir SPARK_WORKER_MEMORY.
Evhz

1

Aşağıdaki örneği kullanarak komut oluşturabilirsiniz

 spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount" 

1

Spark yürütücü belleği, sürücü programınız tarafından verilen talimatlara göre kıvılcım görevlerinizi çalıştırmak için gereklidir. Temel olarak, gönderdiğiniz işe bağlı olarak daha fazla kaynak gerektirir.

Yürütme belleği, görevleri yürütmek için gereken belleği ve JVM'nin boyutundan ve iplik maksimum kap boyutundan büyük olmaması gereken ek yük belleğini içerir.

Spark-defaults.conf dosyasına aşağıdaki parametreleri ekleyin

spar.executor.cores=1

spark.executor.memory=2g

Cloudera yöneticisi veya amabari gibi herhangi bir küme yönetimi aracı kullanıyorsanız, lütfen en son yapılandırmaları kümedeki tüm düğümlere yansıtmak için küme yapılandırmasını yenileyin.

Alternatif olarak, spark-submitsınıf ve uygulama yolu ile birlikte komutu çalıştırırken yürütücü çekirdeği ve bellek değerini argüman olarak iletebiliriz .

Misal:

spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000

0

Kodunuzu etkileşimli olarak spark-shell üzerinde çalıştırdığınızı söylediniz, bu yüzden sürücü belleği veya yürütme belleği için uygun bir değer ayarlanmadıysa, kıvılcım varsayılan olarak ona bir değer atar, bu da özellikler dosyasına dayanır (burada varsayılan değer bahsediliyor).

Umarım bir sürücü (ana düğüm) ve çalışan düğümün (çalıştırıcıların oluşturulduğu ve işlendiği yer) olduğunun farkındasınızdır, bu nedenle kıvılcım programı için temelde iki tür alan gereklidir, bu nedenle ayarlamak isterseniz sürücü belleği sonra kıvılcım kabuğu başlatıldığında.

spark-shell --driver-memory "değeriniz" ve çalıştırıcı belleğini ayarlamak için: spark-shell --executor-memory "sizin değeriniz"

o zaman kıvılcım kabuğunuzun kullanmasını istediğiniz hafızanın istenen değeriyle gitmekte iyi olduğunuzu düşünüyorum.


0
spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000


0

Bildiğim kadarıyla spark.executor.memoryçalışma zamanında değiştirilemeyecek . Pyspark ve graphframes ile bağımsız bir sürüm REPLçalıştırıyorsanız, aşağıdaki komutu uygulayarak pyspark'ı başlatabilirsiniz :

pyspark --driver-memory 2g --executor-memory 6g --packages graphframes:graphframes:0.7.0-spark2.4-s_2.11

SPARK_VERSIONSpark'ın en son yayınlanan sürümüyle ilgili olarak ortam değişkenini uygun şekilde değiştirdiğinizden emin olun.

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.