首页 文章

Spark启动的执行程序多于指定的

提问于
浏览
1

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

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

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

火花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)

2 回答

  • 0

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

    由于您的服务器有96个内核,并且您将defaultcores设置为40,因此您只有2个执行程序的空间,因为2 * 40 = 80.其余16个内核不足以用于另一个执行程序,并且驱动程序也需要CPU内核 .

  • 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
    

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

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

    容器可能超出其内存限制(尽管如此,您应该能够在日志中看到更多内容) .

相关问题