WARN cluster.YarnScheduler: 初始作业尚未接受任何资源

WARN cluster.YarnScheduler: Initial job has not accepted any resources

我 运行 的任何 spark 作业都将失败并显示以下错误消息

17/06/16 11:10:43 WARN cluster.YarnScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

Spark 版本是 1.6,运行ning 在 Yarn 上。

我正在从 pyspark 发布作业。

并且您可以从作业时间轴中注意到它 运行 无限期并且没有添加或删除任何资源。1

第一点是,如果有足够的资源(例如节点、CPU 和内存)可供 yarn 使用,它可以使用动态分配来创建分配了适当默认内核和内存的 spark worker。

就我而言,我需要关闭动态分配,因为我的资源水平非常低。

因此,我从 pyspark 设置了以下值:

conf = (SparkConf().setAppName("simple")
        .set("spark.shuffle.service.enabled", "false")
        .set("spark.dynamicAllocation.enabled", "false")
        .set("spark.cores.max", "1")
        .set("spark.executor.instances","2")
        .set("spark.executor.memory","200m")
        .set("spark.executor.cores","1")

注意:基本上这里设置的值应该小于实际可用的资源。但是,此处的值太小可能会导致内存不足问题,或者在您的作业 运行s 时出现性能下降问题。

The complete code gist of a sample job is available here

对于这个 pyspark 案例,另一个需要注意的重点是 Yarn 上的 Spark 可以 运行 在两种模式下

  1. 集群模式 - spark 驱动程序 运行 在 spark 主节点
  2. 客户端模式 - spark 驱动程序是来自客户端的 运行,其中交互式 shell 是 运行。

集群模式不太适合交互使用 Spark。需要用户输入的 Spark 应用程序,例如 spark-shell 和 pyspark,需要 Spark 驱动程序 运行 在启动 Spark 应用程序的客户端进程中。

客户端模式可以在如下环境中设置
export PYSPARK_SUBMIT_ARGS='--master yarn --deploy-mode client pyspark-shell'