如何为 apache spark worker 更改每个节点的内存
Posted
技术标签:
【中文标题】如何为 apache spark worker 更改每个节点的内存【英文标题】:How to change memory per node for apache spark worker 【发布时间】:2014-08-06 04:21:54 【问题描述】:我正在配置一个 Apache Spark 集群。
当我使用 1 个主设备和 3 个从设备运行集群时,我在主监控页面上看到了这一点:
Memory
2.0 GB (512.0 MB Used)
2.0 GB (512.0 MB Used)
6.0 GB (512.0 MB Used)
我想增加工作人员的已用内存,但找不到合适的配置。我已将 spark-env.sh 更改如下:
export SPARK_WORKER_MEMORY=6g
export SPARK_MEM=6g
export SPARK_DAEMON_MEMORY=6g
export SPARK_JAVA_OPTS="-Dspark.executor.memory=6g"
export JAVA_OPTS="-Xms6G -Xmx6G"
但是使用的内存还是一样的。我应该怎么做才能改变使用的内存?
【问题讨论】:
抱歉这个不好的问题。我发现我想更改执行者的内存。现在,执行者只使用2.0 GB (512.0 MB Used)
。如何通过更改配置或系统环境来增加内存?
【参考方案1】:
使用 1.0.0+ 并使用 spark-shell 或 spark-submit 时,请使用 --executor-memory
选项。例如
spark-shell --executor-memory 8G ...
0.9.0 及以下:
当你开始一个工作或启动 shell 时改变内存。我们必须修改 spark-shell 脚本,以便它将命令行参数作为底层 java 应用程序的参数传递。特别是:
OPTIONS="$@"
...
$FWDIR/bin/spark-class $OPTIONS org.apache.spark.repl.Main "$@"
然后我们可以如下运行我们的spark shell:
spark-shell -Dspark.executor.memory=6g
在为独立 jar 配置它时,我在创建 spark 上下文之前以编程方式设置系统属性并将值作为命令行参数传递(然后我可以使它比冗长的系统属性更短)。
System.setProperty("spark.executor.memory", valueFromCommandLine)
至于更改默认集群范围,抱歉,不完全确定如何正确执行。
最后一点 - 我有点担心您有 2 个 2GB 节点和一个 6GB 节点。您可以使用的内存将被限制为最小的节点 - 所以这里是 2GB。
【讨论】:
spark.executor.memory
是应用程序(作业)使用的内存,而不是分配给 worker 的内存。
理想情况下,您应该在 spark.env.sh 文件中设置值。这允许您设置默认值,而无需在每次运行 shell 时传入参数。【参考方案2】:
worker的默认配置是为每个worker分配Host_Memory - 1Gb
。手动调整该值的配置参数是SPARK_WORKER_MEMORY
,就像你的问题:
export SPARK_WORKER_MEMORY=6g
.
【讨论】:
我明白你的意思,这就是问题的措辞,但我怀疑这就是他想要的,尽管从他在主监视器页面上的描述来看。 @massag 在我的例子中,每个worker默认只使用512MB。当我添加设置export SPARK_WORKER_MEMORY=6g
。它不会为工人创造记忆。我仍然在主监视器页面上看到每个工作人员的内存为 512MB
母版页显示worker总内存和作业当前使用的内存。您的工作人员有 2/2/6Gb 的总内存,目前正在使用 512Mb。那是任务执行者的内存使用情况。要更改它,请使用 spark.executor.memory
。请参阅@samthebest 答案。
@massag 我想增加任务执行器的内存使用量。我已将这一行 export SPARK_JAVA_OPTS="-Dspark.executor.memory=6g"
添加到 spark-env.sh 但它仍然是 512MB。这样做的正确方法是什么?
我也有同样的问题【参考方案3】:
就我而言,我使用 ipython notebook 服务器连接到 spark。我想增加executor的内存。
这就是我的工作:
from pyspark import SparkContext
from pyspark.conf import SparkConf
conf = SparkConf()
conf.setMaster(CLUSTER_URL).setAppName('ipython-notebook').set("spark.executor.memory", "2g")
sc = SparkContext(conf=conf)
【讨论】:
我正在寻找如何在 ipython 中设置内存 2 天,而你的是唯一对我有用的。 是的,这是唯一能让我摆脱 1024MB OOM 地狱的方法! :D【参考方案4】:根据Spark documentation,您可以在提交申请时使用命令行参数--executor-memory
更改每个节点的内存。例如
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://master.node:7077 \
--executor-memory 8G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
我已经测试过了,它可以工作。
【讨论】:
【参考方案5】:在 Spark 1.1.1 中,设置 worker 的 Max Memory。 在 conf/spark.env.sh 中,这样写:
export SPARK_EXECUTOR_MEMORY=2G
如果你还没有使用配置文件,复制模板文件
cp conf/spark-env.sh.template conf/spark-env.sh
然后进行更改,不要忘记来源
source conf/spark-env.sh
【讨论】:
这在 Spark 1.3.0 中对我有用(没有导出)。我确实采购了 spark-env.sh @tristan-wu 这不是纱线专用的吗?以上是关于如何为 apache spark worker 更改每个节点的内存的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Apache Spark 数据集中的枚举列编写案例类?
Worker spark webUI 在 Apache Spark 中不起作用
如何为 .NET Core 3.0 Worker 服务设置事件日志