Spark Python性能调优

时间:2015-01-03 16:48:06

标签: apache-spark pyspark

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

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内存字符串相同

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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

  

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

是的,如果您在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 - 执行者JVM和0.5 * spark.executor.memory - 由Python使用。 / p>

您可能还想调整spark.storage.memoryFraction,默认为0.6

答案 1 :(得分:0)

  

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

不。通常,节点上有多个执行程序。所以spark.executor.memory指定一个执行程序可以占用多少内存。

如果您希望从Spark返回大量数据,您还应该检查spark.driver.memory并进行调整。

是的,它也部分涵盖了Python内存。被解释为Py4J代码并在JVM中运行的部分。

Spark uses Py4J internally将您的代码转换为Java并按原样运行。例如,如果您将Spark管道作为RDD上的lambda函数,那么该Python代码实际上将通过Py4J在执行程序上运行。另一方面,如果你运行一个rdd.collect()然后用它做一个本地Python变量,它将在你的驱动程序上运行Py4J。