Cách đặt bộ nhớ Apache Spark Executor


127

Làm cách nào tôi có thể tăng bộ nhớ khả dụng cho các nút thực thi tia lửa Apache?

Tôi có tệp 2 GB phù hợp để tải vào Apache Spark. Tôi đang chạy apache spark cho thời điểm này trên 1 máy, vì vậy trình điều khiển và người thực thi nằm trên cùng một máy. Máy có bộ nhớ 8 GB.

Khi tôi thử đếm các dòng của tệp sau khi đặt tệp được lưu trong bộ nhớ, tôi gặp các lỗi sau:

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.

Tôi nhìn tài liệu ở đây và thiết lập spark.executor.memoryđể 4g$SPARK_HOME/conf/spark-defaults.conf

Giao diện người dùng hiển thị biến này được đặt trong Môi trường Spark. Bạn có thể tìm thấy ảnh chụp màn hình ở đây

Tuy nhiên, khi tôi chuyển đến tab Executor , giới hạn bộ nhớ cho Executor duy nhất của tôi vẫn được đặt thành 265,4 MB. Tôi cũng vẫn nhận được lỗi tương tự.

Tôi đã thử nhiều thứ được đề cập ở đây nhưng tôi vẫn gặp lỗi và không biết rõ nên thay đổi cài đặt ở đâu.

Tôi đang chạy mã của mình một cách tương tác từ shell-shell

Câu trả lời:


185

Vì bạn đang chạy Spark ở chế độ cục bộ, cài đặt spark.executor.memorysẽ không có bất kỳ ảnh hưởng nào, như bạn đã nhận thấy. Lý do cho điều này là Công nhân "sống" trong quy trình JVM của trình điều khiển mà bạn khởi động khi bạn khởi động spark-shell và bộ nhớ mặc định được sử dụng cho điều đó là 512M . Bạn có thể tăng mức đó bằng cách đặt spark.driver.memorylên mức cao hơn, ví dụ 5g . Bạn có thể làm điều đó bằng một trong hai cách sau:

  • thiết lập nó trong tệp thuộc tính (mặc định là $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • hoặc bằng cách cung cấp cài đặt cấu hình khi chạy

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

Lưu ý rằng điều này không thể đạt được bằng cách cài đặt nó trong ứng dụng, vì lúc đó đã quá muộn, quá trình đã bắt đầu với một lượng bộ nhớ.

Lý do cho 265,4 MB là Spark dành cho spark.st Storage.memoryFraction * spark.st Storage.squilFraction cho tổng số lượng bộ nhớ lưu trữ và theo mặc định chúng là 0,6 và 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Vì vậy, hãy lưu ý rằng không phải toàn bộ dung lượng bộ nhớ trình điều khiển sẽ có sẵn cho bộ lưu trữ RDD.

Nhưng khi bạn bắt đầu chạy cái này trên một cụm, spark.executor.memorycài đặt sẽ tiếp tục khi tính toán số tiền dành cho bộ nhớ cache của Spark.


1
Là 5g tương đương với 5Gb?
Chuck

@Chuck spark.apache.org/docs/latest/... "Số lượng bộ nhớ sử dụng cho quá trình lái xe, tức là nơi SparkContext được khởi tạo, trong định dạng giống như chuỗi ký ức JVM với một đơn vị kích thước hậu tố (" k "" m "," g "hoặc" t ") (ví dụ 512m, 2g)."
James Moore

39

Cũng lưu ý rằng, đối với chế độ cục bộ, bạn phải đặt lượng bộ nhớ trình điều khiển trước khi bắt đầu jvm:

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

Điều này sẽ khởi động JVM với 2G thay vì 512M mặc định.
Chi tiết tại đây :

Đối với chế độ cục bộ, bạn chỉ có một người thực thi và người thực thi này là trình điều khiển của bạn, vì vậy bạn cần đặt bộ nhớ của trình điều khiển thay thế. * Điều đó nói rằng, ở chế độ cục bộ, vào thời điểm bạn chạy spark-submit, một JVM đã được khởi chạy với các cài đặt bộ nhớ mặc định, do đó, cài đặt "spark.driver.memory" trong conf của bạn sẽ không thực sự làm gì cho bạn. Thay vào đó, bạn cần chạy spark-submit như sau


5

Rõ ràng, câu hỏi không bao giờ nói chạy trên chế độ cục bộ không phải trên sợi. Bằng cách nào đó tôi không thể thay đổi spark-default.conf để hoạt động. Thay vào đó tôi đã thử nó và nó làm việc cho tôi

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

(không thể tăng bộ nhớ thực thi đến 8g, có một số hạn chế từ cấu hình sợi.)


OP có đề cập rằng anh ta đang sử dụng một máy duy nhất.
Sharique Abdullah

Bạn làm executor-memorycao hơn driver-memory?
nimeresam

5

Câu trả lời được gửi bởi Grega đã giúp tôi giải quyết vấn đề của mình. Tôi đang chạy Spark cục bộ từ tập lệnh python bên trong container Docker. Ban đầu, tôi gặp lỗi hết bộ nhớ Java khi xử lý một số dữ liệu trong Spark. Tuy nhiên, tôi đã có thể chỉ định thêm bộ nhớ bằng cách thêm dòng sau vào tập lệnh của mình:

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

Dưới đây là một ví dụ đầy đủ về tập lệnh python mà tôi sử dụng để khởi động 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

Bạn cần tăng bộ nhớ trình điều khiển. Trên mac (tức là khi chạy trên máy chủ cục bộ), bộ nhớ trình điều khiển mặc định là 1024M). Theo mặc định, do đó 380Mb được phân bổ cho người thi hành.

Ảnh chụp màn hình

Khi tăng [ --do-memory 2G ], bộ nhớ thực thi đã tăng lên ~ 950Mb. nhập mô tả hình ảnh ở đây


2

tạo một tệp có tên spark-env.sh trong thư mục spark / conf và thêm dòng này

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

1
Chính xác, tôi chạy bản gốc với cấu hình cụ thể, tôi sẽ không cần thêm tùy chọn mỗi khi tôi chạy lệnh spark. Nhưng điều này chỉ dành cho nút cụm, trong trường hợp đó là cài đặt độc lập SPARK_WORKER_MEMORY.
Evhz

1

Bạn có thể xây dựng lệnh bằng cách sử dụng ví dụ sau

 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

Bộ nhớ thực thi Spark là cần thiết để chạy các tác vụ tia lửa của bạn dựa trên các hướng dẫn được cung cấp bởi chương trình trình điều khiển của bạn. Về cơ bản, nó đòi hỏi nhiều tài nguyên phụ thuộc vào công việc bạn đã gửi.

Bộ nhớ thực thi bao gồm bộ nhớ cần thiết để thực hiện các tác vụ cộng với bộ nhớ trên không được lớn hơn kích thước của JVM và kích thước vùng chứa tối đa của sợi.

Thêm các tham số sau trong spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Nếu bạn sử dụng bất kỳ công cụ quản lý cụm nào như cloudera manager hoặc amabari, vui lòng làm mới cấu hình cụm để phản ánh các cấu hình mới nhất cho tất cả các nút trong cụm.

Ngoài ra, chúng ta có thể truyền giá trị bộ nhớ và lõi của bộ thực thi làm đối số trong khi chạy spark-submitlệnh cùng với đường dẫn lớp và ứng dụng.

Thí dụ:

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

bạn đã đề cập rằng bạn đang chạy mã của mình một cách tương tác trên spark-shell, vì vậy, trong khi thực hiện nếu không có giá trị phù hợp nào được đặt cho bộ nhớ trình điều khiển hoặc bộ nhớ thực thi thì sẽ mặc định gán một số giá trị cho nó, dựa trên tệp thuộc tính của nó (trong đó giá trị mặc định là đang được đề cập).

Tôi hy vọng bạn biết rằng thực tế là có một trình điều khiển (nút chính) và nút worker-nút (nơi các trình thực thi được tạo và xử lý), vì vậy về cơ bản hai loại không gian được yêu cầu bởi chương trình spark, vì vậy nếu bạn muốn đặt bộ nhớ trình điều khiển sau đó khi bắt đầu tia lửa điện.

spark-shell --do-memory "your value" và để thiết lập bộ nhớ thực thi: spark-shell --executor-memory "your value"

sau đó tôi nghĩ rằng bạn tốt để đi với giá trị mong muốn của bộ nhớ mà bạn muốn sử dụng tia lửa điện của mình.


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

Theo như tôi biết thì sẽ không thể thay đổi spark.executor.memorythời gian chạy. Nếu bạn đang chạy một phiên bản độc lập, với pyspark và graphframes, bạn có thể khởi chạy pyspark REPLbằng cách thực hiện lệnh sau:

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

Đảm bảo thay đổi SPARK_VERSIONbiến môi trường một cách thích hợp liên quan đến phiên bản Spark mới nhất được phát hành

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.