【问题标题】:Spark starting more executors than specifiedSpark 启动的执行器数量超过指定数量
【发布时间】:2017-01-04 14:23:13
【问题描述】:

我正在使用 Pyspark 以独立(客户端)模式运行 Spark 1.5.1。我正在尝试开始一项似乎内存很重的工作(即在 python 中,因此它不应该是执行程序内存设置的一部分)。我正在一台具有 96 个内核和 128 GB RAM 的机器上进行测试。

我有一个 master 和 worker 正在运行,开始使用 /sbin 中的 start-all.sh 脚本。

这些是我在 /conf 中使用的配置文件。

spark-defaults.conf:

spark.eventLog.enabled           true
spark.eventLog.dir               /home/kv/Spark/spark-1.5.1-bin-hadoop2.6/logs
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.dynamicAllocation.enabled  false
spark.deploy.
defaultCores       40

spark-env.sh:

PARK_MASTER_IP='5.153.14.30'  # Will become deprecated
SPARK_MASTER_HOST='5.153.14.30'
SPARK_MASTER_PORT=7079
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_WEBUI_PORT=8081

我正在使用以下命令启动我的脚本:

export SPARK_MASTER=spark://5.153.14.30:7079  #"local[*]"
spark-submit \
    --master ${SPARK_MASTER} \
    --num-executors 1 \
    --driver-memory 20g \
    --executor-memory 30g \
    --executor-cores 40 \
    --py-files code.zip \
<script>

现在,我注意到我不理解的行为:

  • 当我使用上述设置启动我的应用程序时,我希望有 1 个执行程序。但是,启动了 2 个执行程序,每个执行程序有 30g 的内存和 40 个内核。为什么火花会这样做?我正在尝试限制内核数量以使每个内核拥有更多内存,我该如何执行?现在我的应用程序被杀死了,因为它使用了太多的内存。
  • 当我将executor-cores 增加到 40 以上时,由于资源不足,我的工作无法开始。我希望这是因为我的 spark-defaults 中的 defaultCores 40 设置。但这不只是作为我的应用程序未提供最大内核数时的备份吗?我应该可以覆盖它吧?

从我收到的错误消息中提取:

Lost task 1532.0 in stage 2.0 (TID 5252, 5.153.14.30): org.apache.spark.SparkException: Python worker exited unexpectedly (crashed)
    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:203)
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:207)
    at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
    at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:262)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
    at org.apache.spark.scheduler.Task.run(Task.scala:88)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:139)
    ... 15 more

[...]

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 111 in stage 2.0 failed 4 times, most recent failure: Lost task 111.3 in stage 2.0 (TID 5673, 5.153.14.30): org.apache.spark.SparkException: Python worker exited unexpectedly (crashed)

【问题讨论】:

  • 你有两个答案! :)

标签: apache-spark memory-management pyspark distributed-computing bigdata


【解决方案1】:

检查或设置 spark.executor.instances 的值。默认值为 2,这可以解释为什么你会得到 2 个执行者。

由于您的服务器有 96 个核心,并且您将 defaultcores 设置为 40,因此您只有 2*40 = 80 的空间来容纳 2 个执行器。剩余的 16 个核心不足以容纳另一个执行器,并且驱动程序还需要 CPU 核心。

【讨论】:

    【解决方案2】:

    我希望有 1 个执行人。但是,启动了 2 个执行器

    我想你看到的那个执行者,其实就是司机。

    所以一主一从(共2个节点)。

    您可以将这些配置标志添加到您的脚本中:

    --conf spark.executor.cores=8        <-- will set it 8, you probably want less
    --conf spark.driver.cores=8          <-- same, but for driver only
    

    由于资源不足,我的工作没有开始。

    我相信容器被杀死了。你看,你要求的资源太多,所以每个容器/任务/核心都试图尽可能多地占用内存,而你的系统不能简单地提供更多。

    容器可能会超出其内存限制(不过,您应该能够在日志中看到更多内容来确定)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 2016-12-24
      • 2018-12-07
      • 1970-01-01
      相关资源
      最近更新 更多