Spark 在启动一分钟后释放所有执行者

Spark looses all executors one minute after starting

I 运行 pyspark 在 8 节点 Google dataproc 集群上使用默认设置。 启动后几秒钟,我看到 30 个执行程序核心 运行ning(如预期):

    >>> sc.defaultParallelism
    30

一分钟后:

    >>> sc.defaultParallelism
    2

从那时起,所有操作 运行 仅在 2 个核心上:


    >>> rng = sc.parallelize(range(1,1000000))
    >>> rng.cache()
    >>> rng.count()
    >>> rng.getNumPartitions()
    2

如果我 运行 rng.cache() 当核心仍然连接时,它们会保持连接并且作业会被分发。

检查监控应用程序(主节点上的端口 4040)显示执行程序已删除:

Executor 1
Removed at 2016/02/25 16:20:14
Reason: Container container_1456414665542_0006_01_000002 exited from explicit termination request." 

是否有一些设置可以在没有解决方法的情况下保持核心连接?

在大多数情况下,您所看到的实际上只是 Spark on YARN 与 spark standalone 在配置方式上的差异。目前,YARN 的 "VCores Used" 报告实际上并没有正确对应于真正的内核容器预留,容器实际上只是基于内存预留。

总的来说,这里有几件事在起作用:

动态分配导致 Spark 将空闲执行程序交还给 YARN,不幸的是,目前 spark 打印出垃圾邮件但无害的 "lost executor" 消息。这是 YARN 上 spark 的经典问题,其中 spark 最初瘫痪了它 运行 上的集群,因为它会获取它认为需要的最大数量的容器,然后永远不会放弃它们。

使用动态分配,当你开始一个长时间的工作时,spark 会快速分配新的容器(像指数增长这样的东西,可以在几分钟内快速填满一个完整的 YARN 集群),当空闲时,放弃以大约 60 秒的间隔进行相同斜坡下降的执行程序(如果空闲 60 秒,放弃一些执行程序)。

如果你想禁用动态分配你可以运行:

spark-shell --conf spark.dynamicAllocation.enabled=false

gcloud dataproc jobs submit spark --properties spark.dynamicAllocation.enabled=false --cluster <your-cluster> foo.jar

或者,如果您指定固定数量的执行程序,它也应该自动禁用动态分配:

spark-shell --conf spark.executor.instances=123

gcloud dataproc jobs submit spark --properties spark.executor.instances=123 --cluster <your-cluster> foo.jar