6

我使用以下命令启动了用于 Spark 开发的 iPython 笔记本:

ipython notebook --profile=pyspark

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)

我想更好地理解spark.executor.memory文档中的 ,

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

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

这也是一些属性的列表,是否有一些其他参数可以从默认值进行调整以提高性能。

谢谢!

4

2 回答 2

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- 由 Python 使用。

您可能还想调整spark.storage.memoryFraction,这是0.6默认设置。

于 2015-01-15T16:44:05.767 回答
1

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

没有。通常一个节点上有多个执行器。所以 spark.executor.memory 指定了一个执行器可以占用多少内存。

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

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

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

于 2016-02-05T08:25:13.823 回答