3 回答

TA貢獻1777條經驗 獲得超3個贊
由于您已經在本地模式下運行Spark,因此設置spark.executor.memory不會產生任何影響。這樣做的原因是,在啟動spark-shell時,Worker在啟動的驅動程序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的內存緩存的數量時接管。

TA貢獻1806條經驗 獲得超5個贊
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)
- 3 回答
- 0 關注
- 942 瀏覽
添加回答
舉報