Apache spark Spark-Python性能调优
我使用下面的命令为Spark开发提供了一个iPython笔记本:Apache spark Spark-Python性能调优,apache-spark,pyspark,Apache Spark,Pyspark,我使用下面的命令为Spark开发提供了一个iPython笔记本: ipython notebook --profile=pyspark 我使用Python代码创建了一个scSparkContext,如下所示: import sys import os os.environ["YARN_CONF_DIR"] = "/etc/hadoop/conf" sys.path.append("/opt/cloudera/parcels/CDH/lib/spark/python") sys.path.app
ipython notebook --profile=pyspark
我使用Python代码创建了一个sc
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)
我想更好地理解文档中的spark.executor.memory
每个执行器进程使用的内存量,格式与JVM内存字符串相同
这是否意味着在一个节点上运行的所有进程的累积内存不会超过该上限?如果是这样,我是否应该将该数字设置为尽可能高的数字
这里还有一些属性的列表,还有一些其他参数可以从默认值调整以提高性能
谢谢
这是否意味着运行在上的所有进程的累积内存
一个节点将不会超过该上限
是的,如果您在客户机模式下使用Spark,否则它只会限制JVM
然而,纱线的这种设置有一个棘手的问题。纱线将累计内存限制为spark.executor.memory
并且spark对executor JVM使用相同的限制,在这种限制下Python没有内存,这就是我必须关闭纱线限制的原因
根据您的独立Spark配置,诚实回答您的问题:
不,spark.executor.memory
不限制Python的内存分配
顺便说一句,将选项设置为SparkConf不会对Spark独立执行器产生任何影响,因为它们已经启动。阅读更多关于conf/spark defaults.conf
如果是这样,我是否应该将该数字设置为尽可能高的数字
你应该把它设置为一个平衡的数字。JVM有一个特殊的特性:它最终会分配spark.executor.memory
,而不会释放它。不能将spark.executor.memory
设置为TOTAL\u RAM/EXECUTORS\u COUNT
,因为它将占用Java的所有内存
在我的环境中,我使用spark.executor.memory=(TOTAL_RAM/EXECUTORS\u COUNT)/1.5
,这意味着0.6*spark.executor.memory
将由spark缓存使用,0.4*spark.executor.memory
-executor-JVM和0.5*spark.executor.memory
-Python使用
您可能还需要调整spark.storage.memoryFraction
,默认值为0.6
这是否意味着运行在上的所有进程的累积内存
一个节点不会超过该上限?如果是这样的话,我应该设置
把那个数字改成尽可能高的数字
没有。通常,一个节点上有多个执行器。所以spark.executor.memory指定一个执行器可以占用多少内存
如果希望spark返回大量数据,还应检查spark.driver.memory并对其进行调整
是的,它也部分覆盖了Python内存。被解释为代码并在JVM中运行的部分
将代码翻译成Java并以此方式运行。例如,如果您将Spark管道作为RDD上的lambda函数,那么Python代码实际上将通过Py4J在执行器上运行。另一方面,如果您运行rdd.collect()并将其作为本地Python变量进行处理,则将在驱动程序上通过Py4J运行该变量。请澄清您的第二段到最后一段。你是怎么计算出0.6,0.4,尤其是0.5的python@javadba,0.6是spark.storage.memoryFraction(默认值),0.4是(1-0.6),Python的0.5是我对我的用例的期望值(在最坏的情况下,您可能会期望Python的内存使用率为0.6*2或更高,因此0.5是我的环境的纯经验值)让我们考虑使用NUMPY和一些使用本地代码的Python机器学习库。所有这些内存是来自spark.executor.memory还是仅仅来自spark外部的O/S?谢谢@javadba,是的!内存只包含spark的Java部分。感谢您的这些输入,它非常有用。我投了赞成票。