Cara mengatur memori Apache Spark Executor

127

Bagaimana saya dapat meningkatkan memori yang tersedia untuk node eksekutor percikan Apache?

Saya memiliki file 2 GB yang cocok untuk memuat ke Apache Spark. Saya menjalankan percikan apache untuk saat ini pada 1 mesin, sehingga driver dan eksekutor berada pada mesin yang sama. Mesin ini memiliki memori 8 GB.

Ketika saya mencoba menghitung baris file setelah mengatur file yang akan di-cache di memori saya mendapatkan kesalahan ini:

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.

Aku melihat dokumentasi di sini dan set spark.executor.memoryke 4gdalam$SPARK_HOME/conf/spark-defaults.conf

UI menunjukkan variabel ini diatur di Lingkungan Spark. Anda dapat menemukan tangkapan layar di sini

Namun ketika saya pergi ke tab Pelaksana batas memori untuk Pelaku tunggal saya masih diatur ke 265,4 MB. Saya juga masih mendapatkan kesalahan yang sama.

Saya mencoba berbagai hal yang disebutkan di sini tetapi saya masih mendapatkan kesalahan dan tidak memiliki ide yang jelas di mana saya harus mengubah pengaturan.

Saya menjalankan kode saya secara interaktif dari spark-shell

WillamS
sumber

Jawaban:

185

Karena Anda menjalankan Spark dalam mode lokal, pengaturan spark.executor.memorytidak akan memiliki efek apa pun, seperti yang Anda perhatikan. Alasan untuk ini adalah bahwa Pekerja "hidup" dalam proses JVM driver yang Anda mulai ketika Anda memulai spark-shell dan memori default yang digunakan untuk itu adalah 512M . Anda dapat meningkatkannya dengan mengatur spark.driver.memoryke sesuatu yang lebih tinggi, misalnya 5g . Anda dapat melakukannya dengan:

  • mengaturnya di file properti (default adalah $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • atau dengan memasok pengaturan konfigurasi saat runtime

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

Perhatikan bahwa ini tidak dapat dicapai dengan mengaturnya di aplikasi, karena sudah terlambat pada saat itu, proses sudah dimulai dengan sejumlah memori.

Alasan 265,4 MB adalah bahwa Spark mendedikasikan spark.storage.memoryFraction * spark.storage.safetyFraction dengan jumlah total memori penyimpanan dan secara default adalah 0,6 dan 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Jadi ketahuilah bahwa tidak seluruh jumlah memori driver akan tersedia untuk penyimpanan RDD.

Tetapi ketika Anda akan mulai menjalankan ini pada sebuah cluster, spark.executor.memorypengaturan akan mengambil alih ketika menghitung jumlah yang didedikasikan untuk cache memori Spark.

Grega Kešpret
sumber
1
Apakah 5g setara dengan 5Gb?
Chuck
@Chuck spark.apache.org/docs/latest/… "Jumlah memori yang digunakan untuk proses driver, yaitu di mana SparkContext diinisialisasi, dalam format yang sama dengan string memori JVM dengan akhiran satuan ukuran (" k "," m "," g "atau" t ") (mis. 512m, 2g)."
James Moore
39

Juga perhatikan, bahwa untuk mode lokal Anda harus mengatur jumlah memori driver sebelum memulai jvm:

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

Ini akan memulai JVM dengan 2G bukannya 512M default.
Detail di sini :

Untuk mode lokal Anda hanya memiliki satu eksekutor, dan eksekutor ini adalah driver Anda, jadi Anda perlu mengatur memori driver. * Yang mengatakan, dalam mode lokal, pada saat Anda menjalankan spark-submit, JVM telah diluncurkan dengan pengaturan memori default, jadi pengaturan "spark.driver.memory" di conf Anda tidak akan benar-benar melakukan apa pun untuk Anda. Sebaliknya, Anda perlu menjalankan percikan-kirim sebagai berikut

Dmitriy Selivanov
sumber
5

Rupanya, pertanyaannya tidak pernah mengatakan untuk berjalan pada mode lokal bukan pada benang. Entah bagaimana saya tidak bisa mendapatkan perubahan percikan-default.conf untuk bekerja. Sebaliknya saya mencoba ini dan itu berhasil untuk saya

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

(tidak dapat meningkatkan memori pelaksana ke 8g ada batasan dari konfigurasi benang.)

Somum
sumber
OP tidak menyebutkan bahwa dia menggunakan satu mesin.
Sharique Abdullah
Anda membuat executor-memorylebih tinggi dari driver-memory?
nimeresam
5

Jawaban yang diajukan oleh Grega membantu saya untuk menyelesaikan masalah saya. Saya menjalankan Spark secara lokal dari skrip python di dalam wadah Docker. Awalnya saya mendapatkan error Java out-of-memory ketika memproses beberapa data di Spark. Namun, saya dapat menetapkan lebih banyak memori dengan menambahkan baris berikut ke skrip saya:

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

Berikut ini adalah contoh lengkap skrip python yang saya gunakan untuk memulai Spark:

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)
Sarah
sumber
4

Anda perlu menambah memori driver. Pada mac (mis. Ketika menjalankan pada master lokal), memori driver default adalah 1024M). Secara default, dengan demikian 380MB dialokasikan untuk pelaksana.

Tangkapan layar

Setelah meningkatkan [ --driver-memory 2G ], memori pelaksana bertambah menjadi ~ 950Mb. masukkan deskripsi gambar di sini

Sanchay
sumber
2

buat file bernama spark-env.sh di direktori spark / conf dan tambahkan baris ini

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor
Mohamed Thasin ah
sumber
1
Tepat, saya menjalankan master dengan konfigurasi beton, saya tidak perlu menambahkan opsi setiap kali saya menjalankan perintah percikan. Tapi ini hanya untuk node cluster, kalau-kalau pengaturan mandiri SPARK_WORKER_MEMORY.
Evhz
1

Anda dapat membangun perintah menggunakan contoh berikut

 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" 
vaquar khan
sumber
1

Memori spark executor diperlukan untuk menjalankan tugas spark Anda berdasarkan instruksi yang diberikan oleh program driver Anda. Pada dasarnya, ini membutuhkan lebih banyak sumber daya yang tergantung pada pekerjaan yang Anda kirimkan.

Memori pelaksana mencakup memori yang diperlukan untuk menjalankan tugas-tugas ditambah memori overhead yang tidak boleh lebih besar dari ukuran JVM dan ukuran wadah maksimal benang.

Tambahkan parameter berikut di spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Jika Anda menggunakan alat manajemen cluster seperti cloudera manager atau amabari, segarkan konfigurasi cluster untuk mencerminkan konfigurasi terbaru ke semua node di cluster.

Sebagai alternatif, kita dapat melewatkan inti pelaksana dan nilai memori sebagai argumen saat menjalankan spark-submitperintah bersama dengan kelas dan jalur aplikasi.

Contoh:

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
Radhakrishnan Rk
sumber
0

Anda menyebutkan bahwa Anda menjalankan kode Anda secara interaktif pada spark-shell demikian, sambil melakukan jika tidak ada nilai yang tepat ditetapkan untuk memori driver atau memori pelaksana kemudian memicu secara default menetapkan beberapa nilai untuk itu, yang didasarkan pada file properti itu (di mana nilai default adalah disebutkan).

Saya harap Anda menyadari fakta bahwa ada satu driver (master node) dan pekerja-node (di mana pelaksana dibuat dan diproses), jadi pada dasarnya dua jenis ruang diperlukan oleh program percikan, jadi jika Anda ingin mengatur memori driver kemudian ketika mulai spark-shell.

spark-shell --driver-memory "value Anda" dan untuk mengatur memori pelaksana: spark-shell --executor-memory "value Anda"

maka saya pikir Anda baik untuk pergi dengan nilai memori yang diinginkan yang Anda inginkan percikan-cangkang Anda untuk digunakan.

A.Mishra
sumber
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
tajam
sumber
0

Di Windows atau Linux, Anda dapat menggunakan perintah ini:

spark-shell --driver-memory 2G

masukkan deskripsi gambar di sini

Robert David Ramírez Garcia
sumber
0

Sejauh yang saya tahu tidak mungkin mengubah spark.executor.memorywaktu berjalan. Jika Anda menjalankan versi yang berdiri sendiri, dengan pyspark dan graphframes, Anda dapat meluncurkan pyspark REPLdengan menjalankan perintah berikut:

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

Pastikan untuk mengubah SPARK_VERSIONvariabel lingkungan dengan tepat berkenaan dengan versi terbaru dari Spark

Taie
sumber