วิธีตั้งค่าหน่วยความจำ Apache Spark Executor


128

ฉันจะเพิ่มหน่วยความจำที่พร้อมใช้งานสำหรับโหนดตัวดำเนินการ Apache spark ได้อย่างไร

ฉันมีไฟล์ 2 GB ที่เหมาะสำหรับการโหลดไปยัง Apache Spark ฉันกำลังใช้งาน apache spark ในเครื่อง 1 เครื่องดังนั้นไดรเวอร์และตัวดำเนินการจึงอยู่ในเครื่องเดียวกัน เครื่องมีหน่วยความจำ 8 GB

เมื่อฉันลองนับบรรทัดของไฟล์หลังจากตั้งค่าไฟล์ที่จะแคชในหน่วยความจำฉันได้รับข้อผิดพลาดเหล่านี้:

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.

ฉันดูเอกสารที่นี่และตั้งค่าspark.executor.memoryเป็น4gใน$SPARK_HOME/conf/spark-defaults.conf

UI แสดงตัวแปรนี้ถูกตั้งค่าใน Spark Environment คุณสามารถดูภาพหน้าจอได้ที่นี่

อย่างไรก็ตามเมื่อฉันไปที่แท็บ Executorขีด จำกัด หน่วยความจำสำหรับ Executor เดียวของฉันยังคงตั้งไว้ที่ 265.4 MB ฉันยังคงได้รับข้อผิดพลาดเดียวกัน

ฉันลองสิ่งต่างๆที่กล่าวถึงที่นี่แต่ยังคงได้รับข้อผิดพลาดและไม่มีความคิดที่ชัดเจนว่าควรเปลี่ยนการตั้งค่าที่ใด

ฉันรันโค้ดของฉันแบบโต้ตอบจาก spark-shell

คำตอบ:


186

เนื่องจากคุณใช้ Spark ในโหมดโลคัลการตั้งค่าspark.executor.memoryจะไม่มีผลใด ๆ อย่างที่คุณสังเกตเห็น เหตุผลของเรื่องนี้คือการที่คนทำงาน "ชีวิต" ในโปรแกรมควบคุมกระบวนการ JVM ที่คุณเริ่มต้นเมื่อคุณเริ่มต้นจุดประกายเปลือกและหน่วยความจำเริ่มต้นที่ใช้สำหรับการที่เป็น512M คุณสามารถเพิ่มว่าโดยการตั้งค่าspark.driver.memoryไปยังสิ่งที่สูงขึ้นเช่น5g คุณสามารถทำได้โดย:

  • ตั้งค่าในไฟล์คุณสมบัติ (ค่าเริ่มต้นคือ$SPARK_HOME/conf/spark-defaults.conf)

    spark.driver.memory              5g
    
  • หรือโดยการจัดเตรียมการตั้งค่าคอนฟิกที่รันไทม์

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

โปรดทราบว่าสิ่งนี้ไม่สามารถทำได้โดยการตั้งค่าในแอปพลิเคชันเนื่องจากตอนนี้สายเกินไปแล้วกระบวนการได้เริ่มต้นด้วยหน่วยความจำจำนวนหนึ่งแล้ว

เหตุผลสำหรับ265.4 MBคือ Spark อุทิศ spark.storage.memoryFraction * spark.storage.safetyFractionให้กับจำนวนหน่วยความจำหน่วยเก็บข้อมูลทั้งหมดและโดยค่าเริ่มต้นคือ 0.6 และ 0.9

512 MB * 0.6 * 0.9 ~ 265.4 MB

ดังนั้นโปรดทราบว่าหน่วยความจำไดรเวอร์จะไม่พร้อมใช้งานสำหรับพื้นที่จัดเก็บ RDD

แต่เมื่อคุณเริ่มเรียกใช้สิ่งนี้ในคลัสเตอร์การspark.executor.memoryตั้งค่าจะเข้ามาแทนที่เมื่อคำนวณจำนวนเงินเพื่ออุทิศให้กับแคชหน่วยความจำของ Spark


1
5g เทียบเท่ากับ 5Gb หรือไม่?
Chuck

@Chuck spark.apache.org/docs/latest/... "จำนวนของหน่วยความจำที่จะใช้สำหรับกระบวนการขับคือที่ SparkContext จะเริ่มต้นในรูปแบบเดียวกับสตริงหน่วยความจำ JVM มีคำต่อท้ายหน่วยขนาด (" k "" ม. "," g "หรือ" t ") (เช่น 512m, 2g)"
James Moore

40

โปรดทราบว่าสำหรับโหมดโลคัลคุณต้องตั้งค่าจำนวนหน่วยความจำไดรเวอร์ก่อนเริ่ม jvm:

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

สิ่งนี้จะเริ่ม JVM ด้วย 2G แทนค่าเริ่มต้น 512M
รายละเอียดที่นี่ :

สำหรับโหมดโลคัลคุณมีตัวดำเนินการเพียงตัวเดียวและตัวดำเนินการนี้เป็นไดรเวอร์ของคุณดังนั้นคุณต้องตั้งค่าหน่วยความจำไดรเวอร์แทน * ที่กล่าวว่าในโหมดโลคัลเมื่อคุณเรียกใช้ spark-submit JVM ได้เปิดตัวพร้อมการตั้งค่าหน่วยความจำเริ่มต้นแล้วดังนั้นการตั้งค่า "spark.driver.memory" ใน conf ของคุณจะไม่ทำอะไรให้คุณเลย แต่คุณต้องเรียกใช้ spark-submit ดังนี้


6

เห็นได้ชัดว่าคำถามไม่เคยบอกว่าทำงานในโหมดท้องถิ่นไม่ใช่บนเส้นด้าย ฉันไม่สามารถเปลี่ยน spark-default.conf ให้ทำงานได้ แต่ฉันลองสิ่งนี้และมันก็ได้ผลสำหรับฉัน

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

(ไม่สามารถชนหน่วยความจำตัวดำเนินการถึง 8g มีข้อ จำกัด บางประการจากการกำหนดค่าเส้นด้าย)


OP พูดถึงว่าเขาใช้เครื่องเดียว
Sharique Abdullah

คุณทำให้executor-memoryสูงกว่าdriver-memory?
nimeresam

5

คำตอบที่ส่งโดย Grega ช่วยฉันแก้ปัญหาของฉัน ฉันกำลังใช้งาน Spark ในเครื่องจากสคริปต์ python ภายในคอนเทนเนอร์ Docker ตอนแรกฉันได้รับข้อผิดพลาด Java ไม่อยู่ในหน่วยความจำเมื่อประมวลผลข้อมูลบางอย่างใน Spark อย่างไรก็ตามฉันสามารถกำหนดหน่วยความจำเพิ่มเติมได้โดยเพิ่มบรรทัดต่อไปนี้ในสคริปต์ของฉัน:

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

นี่คือตัวอย่างทั้งหมดของสคริปต์ python ที่ฉันใช้เพื่อเริ่ม 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)

4

คุณต้องเพิ่มหน่วยความจำไดรเวอร์ใน Mac (เช่นเมื่อทำงานบนโลคัลมาสเตอร์) หน่วยความจำไดรเวอร์เริ่มต้นคือ 1024M) โดยค่าเริ่มต้น 380Mb จึงถูกจัดสรรให้กับตัวดำเนินการ

ภาพหน้าจอ

เมื่อเพิ่ม [ --driver-memory 2G ] หน่วยความจำของผู้ดำเนินการก็เพิ่มขึ้นเป็น ~ 950Mb ใส่คำอธิบายภาพที่นี่


2

สร้างไฟล์ชื่อ spark-env.sh ในไดเร็กทอรี spark / conf และเพิ่มบรรทัดนี้

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

1
แน่นอนฉันเรียกใช้ต้นแบบด้วยการกำหนดค่าที่เป็นรูปธรรมฉันไม่จำเป็นต้องเพิ่มตัวเลือกทุกครั้งที่เรียกใช้คำสั่ง spark SPARK_WORKER_MEMORYแต่นี้เป็นเพียงสำหรับโหนดคลัสเตอร์ในกรณีที่มันเป็นแบบสแตนด์อโลนการตั้งค่า
Evhz

1

คุณสามารถสร้างคำสั่งโดยใช้ตัวอย่างต่อไปนี้

 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 Executionor จำเป็นสำหรับการรันงานจุดประกายของคุณตามคำแนะนำที่กำหนดโดยโปรแกรมไดรเวอร์ของคุณ โดยทั่วไปจะต้องใช้ทรัพยากรมากขึ้นซึ่งขึ้นอยู่กับงานที่คุณส่ง

หน่วยความจำของผู้ดำเนินการรวมถึงหน่วยความจำที่จำเป็นสำหรับการดำเนินการงานบวกกับหน่วยความจำเหนือศีรษะซึ่งไม่ควรมากกว่าขนาดของ JVM และขนาดคอนเทนเนอร์สูงสุดของเส้นด้าย

เพิ่มพารามิเตอร์ต่อไปนี้ใน spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

หากคุณใช้เครื่องมือการจัดการคลัสเตอร์เช่นcloudera managerหรือamabariโปรดรีเฟรชการกำหนดค่าคลัสเตอร์เพื่อสะท้อนการกำหนดค่าล่าสุดไปยังโหนดทั้งหมดในคลัสเตอร์

หรือเราสามารถส่งผ่านแกนตัวดำเนินการและค่าหน่วยความจำเป็นอาร์กิวเมนต์ขณะทำงาน spark-submitคำสั่งพร้อมกับคลาสและเส้นทางของแอปพลิเคชัน

ตัวอย่าง:

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

คุณบอกว่าคุณกำลังเรียกใช้ yourcode แบบโต้ตอบบน spark-shell ดังนั้นในขณะที่ทำหากไม่มีการตั้งค่าที่เหมาะสมสำหรับหน่วยความจำไดรเวอร์หรือหน่วยความจำของผู้ดำเนินการจากนั้นจุดประกายกำหนดค่าเริ่มต้นให้กับมันซึ่งขึ้นอยู่กับไฟล์คุณสมบัติของมัน (โดยที่ค่าเริ่มต้นคือ ถูกกล่าวถึง)

ฉันหวังว่าคุณจะตระหนักถึงความจริงที่ว่ามีไดรเวอร์หนึ่งตัว (โหนดหลัก) และโหนดของผู้ปฏิบัติงาน (ซึ่งตัวดำเนินการถูกสร้างและประมวลผล) ดังนั้นโดยทั่วไปโปรแกรม spark จึงต้องการพื้นที่สองประเภทดังนั้นหากคุณต้องการตั้งค่า หน่วยความจำไดรเวอร์จากนั้นเมื่อสตาร์ท spark-shell

spark-shell --driver-memory "your value" และตั้งค่าหน่วยความจำของผู้ปฏิบัติการ: spark-shell --executor-memory "your value"

ฉันคิดว่าคุณดีที่จะใช้ค่าหน่วยความจำที่ต้องการซึ่งคุณต้องการให้ใช้ประกายไฟ


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

เท่าที่ฉันรู้ว่ามันเป็นไปไม่ได้ที่จะเปลี่ยนspark.executor.memoryเวลาทำงาน หากคุณใช้งานเวอร์ชันสแตนด์อะโลนด้วย pyspark และกราฟเฟรมคุณสามารถเรียกใช้ pyspark ได้REPLโดยดำเนินการคำสั่งต่อไปนี้:

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

อย่าลืมเปลี่ยนSPARK_VERSIONตัวแปรสภาพแวดล้อมให้เหมาะสมกับ Spark เวอร์ชันล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.