Spark Python性能调优

B.M*_*.W. 6 apache-spark pyspark

我使用以下命令为Spark开发了一个iPython笔记本:

ipython notebook --profile=pyspark
Run Code Online (Sandbox Code Playgroud)

sc使用Python代码创建了一个SparkContext,如下所示:

import sys
import os
os.environ["YARN_CONF_DIR"] = "/etc/hadoop/conf"
sys.path.append("/opt/cloudera/parcels/CDH/lib/spark/python")
sys.path.append("/opt/cloudera/parcels/CDH/lib/spark/python/lib/py4j-0.8.1-src.zip")
from pyspark import SparkContext, SparkConf
from pyspark.sql import *

sconf = SparkConf()
conf = (SparkConf().setMaster("spark://701.datafireball.com:7077")
    .setAppName("sparkapp1")
    .set("spark.executor.memory", "6g"))
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)

我想spark.executor.memory在文件中更好地理解

每个执行程序进程使用的内存量,格式与JVM内存字符串相同

这是否意味着在一个节点上运行的所有进程的累积内存不会超过该上限?如果是这种情况,我应该将该数字设置为尽可能高的数字吗?

这里还列出了一些属性,是否有一些其他参数我可以从默认调整以提升性能.

谢谢!

Vla*_*lov 6

这是否意味着在一个节点上运行的所有进程的累积内存不会超过该上限?

是的,如果您在YARN客户端模式下使用Spark,否则它仅限制JVM.

然而,YARN对这个设置有一个棘手的问题.YARN限制累积的内存,spark.executor.memory而Spark对执行程序JVM使用相同的限制,在这样的限制内没有Python的内存,这就是我必须关闭YARN限制的原因.

至于根据您的独立Spark配置对您的问题的诚实回答:不,spark.executor.memory不限制Python的内存分配.

顺便说一句,将选项设置为SparkConf对Spark独立执行程序没有任何影响,因为它们已经启动.了解更多conf/spark-defaults.conf

如果是这种情况,我应该将该数字设置为尽可能高的数字吗?

您应该将其设置为平衡数字.JVM有一个特定的功能:它spark.executor.memory最终会分配,永远不会释放它.你无法设置spark.executor.memory,TOTAL_RAM / EXECUTORS_COUNT因为它将占用Java的所有内存.

在我的环境中,我使用spark.executor.memory=(TOTAL_RAM / EXECUTORS_COUNT) / 1.5,这意味着0.6 * spark.executor.memory将由Spark缓存,0.4 * spark.executor.memory- executor JVM和0.5 * spark.executor.memory- 使用.

您可能还想调整spark.storage.memoryFraction,0.6默认情况下.