memory - 관리 - yarn 메모리 설정




Apache Spark Executor 메모리를 설정하는 방법 (6)

Apache spark executor 노드에 사용 가능한 메모리를 늘리려면 어떻게해야합니까?

Apache Spark에로드하기에 적합한 2GB 파일이 있습니다. 나는 지금 한 컴퓨터에서 아파치 스파크를 실행하고 있으므로 드라이버와 실행기가 같은 컴퓨터에 있습니다. 기계에는 8GB의 메모리가 있습니다.

메모리에 캐시되도록 파일을 설정 한 후 파일의 줄 수를 세려고하면 다음 오류가 발생합니다.

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.

here 에서 설명서를보고 $SPARK_HOME/conf/spark-defaults.conf 에서 spark.executor.memory4g 로 설정 spark.executor.memory

UI는이 변수가 Spark 환경에서 설정되었음을 보여줍니다. here 스크린 샷을 찾을 수 있습니다

그러나 Executor 탭으로 이동하면 단일 Executor의 메모리 제한은 여전히 ​​265.4MB로 설정됩니다. 나는 여전히 같은 오류가 발생합니다.

here 언급 된 다양한 것을 시도했지만 여전히 오류가 발생하고 설정을 변경 해야하는 곳을 명확하게 알지 못합니다.

spark-shell에서 대화식으로 코드를 실행하고 있습니다.


Grega가 제출 한 답변으로 문제를 해결하는 데 도움이되었습니다. Docker 컨테이너 내의 Python 스크립트에서 로컬로 Spark를 실행하고 있습니다. 처음에 Spark에서 일부 데이터를 처리 할 때 Java 메모리 부족 오류가 발생했습니다. 그러나 스크립트에 다음 줄을 추가하여 더 많은 메모리를 할당 할 수있었습니다.

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

Spark를 시작하는 데 사용하는 Python 스크립트의 전체 예는 다음과 같습니다.

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)

spark / conf 디렉토리에 spark-env.sh라는 파일을 만들고이 줄을 추가하십시오

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

당신은 spark-shell에서 코드를 상호 작용 적으로 실행한다고 언급 했으므로 드라이버 메모리 또는 실행기 메모리에 적절한 값이 설정되어 있지 않으면 스파크는 속성 파일 (기본 값은 언급).

나는 당신이 하나의 드라이버 (마스터 노드)와 워커 노드 (실행자가 생성되고 처리되는 곳)가 있다는 사실을 알고 있기 때문에 기본적으로 spark 프로그램에는 두 가지 유형의 공간이 필요합니다. 그러면 드라이버 메모리가 시작될 때 spark-shell.

spark-shell --driver-memory "값"및 실행기 메모리 설정 : spark-shell --executor-memory "값"

그런 다음 스파크 쉘에서 사용하려는 원하는 메모리 값을 사용하는 것이 좋습니다.


드라이버 메모리를 늘려야합니다. Mac에서 (즉, 로컬 마스터에서 실행할 때) 기본 드라이버 메모리는 1024M입니다. 따라서 기본적으로 380Mb가 실행기에 할당됩니다.

[ --driver-memory 2G ]를 늘리면 실행기 메모리가 ~ 950Mb로 증가했습니다.


로컬 모드에서 Spark를 실행하고 있으므로 spark.executor.memory 를 설정해도 아무런 영향이 없습니다. 그 이유는 spark-shell 을 시작할 때 시작하는 드라이버 JVM 프로세스 내에서 워커가 "작동"하며 이에 사용되는 기본 메모리가 512M 이기 때문입니다. spark.driver.memory 를 더 높은 값 (예 : 5g) 으로 설정 spark.driver.memory 이를 늘릴 수 있습니다. 다음 중 하나를 수행하면됩니다.

  • 속성 파일에서 설정 (기본값은 spark-defaults.conf)

    spark.driver.memory              5g
    
  • 또는 런타임에 구성 설정을 제공하여

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

이미 너무 늦었 기 때문에 프로세스가 이미 약간의 메모리로 시작했기 때문에 응용 프로그램에서 설정하면이 작업을 수행 할 수 없습니다.

265.4MB 의 이유는 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의 메모리 캐시 전용 크기를 계산할 때 spark.executor.memory 사용됩니다.


분명히, 질문은 원사가 아닌 로컬 모드에서 실행된다고 결코 말하지 않습니다. 어떻게 든 spark-default.conf 변경을 작동시킬 수 없었습니다. 대신 나는 이것을 시도했고 그것은 나를 위해 일했다.

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

(8g의 범프 범프 실행기 메모리는 원사 구성에 약간의 제한이 있습니다.)





apache-spark