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 关注
- 871 浏览
添加回答
举报