问题 Spark:检查您的集群UI以确保已注册工作人员


我在Spark中有一个简单的程序:

/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
  def main(args: Array[String]) {
    val conf = new SparkConf().setMaster("spark://10.250.7.117:7077").setAppName("Simple Application").set("spark.cores.max","2")
    val sc = new SparkContext(conf)    
    val ratingsFile = sc.textFile("hdfs://hostname:8020/user/hdfs/mydata/movieLens/ds_small/ratings.csv")

    //first get the first 10 records 
    println("Getting the first 10 records: ")
    ratingsFile.take(10)    

    //get the number of records in the movie ratings file
    println("The number of records in the movie list are : ")
    ratingsFile.count() 
  }
}

当我尝试从spark-shell运行这个程序时,即我登录到名称节点(Cloudera安装)并在spark-shell上顺序运行命令:

val ratingsFile = sc.textFile("hdfs://hostname:8020/user/hdfs/mydata/movieLens/ds_small/ratings.csv")
println("Getting the first 10 records: ")
ratingsFile.take(10)    
println("The number of records in the movie list are : ")
ratingsFile.count() 

我得到了正确的结果,但如果我尝试从excel运行程序,没有资源分配给程序,在控制台日志中,我看到的是:

WARN TaskSchedulerImpl:初始作业未接受任何资源;检查群集UI以确保工作人员已注册并具有足够的资源

另外,在Spark UI中,我看到了:

工作继续运行 - 火花

此外,应该注意的是,这个版本的spark与Cloudera一起安装(因此没有工作节点出现)。

我应该怎么做才能使这项工作?

编辑:

我检查了HistoryServer,这些作业没有显示在那里(即使在不完整的应用程序中)


13201
2018-02-26 22:02


起源

有关错误消息第一部分的相关问题: TaskSchedulerImpl: Initial job has not accepted any resources; - bluenote10


答案:


我已经为许多spark集群进行了配置和性能调优,这是一个非常常见/正常的消息,可以看到您何时首次准备/配置集群来处理工作负载。

这是明确的,因为没有足够的资源来启动工作。这项工作要求以下之一:

  • 每个工作者的内存多于分配给它的内存(1GB)
  • 比集群上可用的CPU更多

12
2018-02-27 05:54



我认为问题在于部署这项工作的方式。仅当spark具有自己的主服务器和从服务器时,才应指定主URL。但是,在我的情况下,该程序在YARN群集上运行。在这种情况下,不确定部署的工作原理。 - vineet sinha
对于纱线,主人很简单 --master yarn  spark.apache.org/docs/latest/running-on-yarn.html - javadba
spark.apache.org/docs/latest/configuration。原因是独立模式下的默认选项不好,如果不在YARN模式下调低--total-executor-cores 1的数量,则会阻塞整个集群,独立模式下工作者的所有可用内核和Mesos粗粒度模式。 - mathtick


您可以检查群集的工作节点核心:您的应用程序不能超过该核心。例如,您有两个工作节点。每个工作节点你有4个核心。然后你有2个应用程序要运行。因此,您可以为每个应用程序提供4个内核来运行该作业。

您可以在代码中设置如下:

SparkConf sparkConf = new SparkConf().setAppName("JianSheJieDuan")
                          .set("spark.cores.max", "4");

这个对我有用。


2
2018-06-17 03:33





终于弄明白了答案是什么。

在YARN群集上部署spark程序时,主URL只是yarn。

所以在程序中,spark上下文应该如下所示:

val conf = new SparkConf().setAppName("SimpleApp")

然后应该使用Maven构建这个eclipse项目,并且应该将生成的jar部署到集群上,方法是将其复制到集群,然后运行以下命令

spark-submit --master yarn --class "SimpleApp" Recommender_2-0.0.1-SNAPSHOT.jar

这意味着直接从eclipse运行是行不通的。


1
2018-02-29 19:51



我在hdp 2.4中遇到类似的错误。在独立模式下将hdp设置为master时,我可以从slave服务器向主服务器运行spark-shell。然后我可以运行像“val distData = sc.parallelize(Array(1,2,3,4,5))”这样的方法。但是当尝试从hdfs读取文件时,它会抛出错误。它似乎可以在eclipse中工作。希望有人可以帮助〜 - Decula


你没有任何工人来执行这项工作。作业的执行没有可用的核心,这就是作业状态仍在“等待”的原因。

如果您没有在Cloudera注册的工人,这些工作将如何执行?


-1
2018-02-26 23:12



根据我所知,如果Spark在YARN上运行,工作节点不会显示在UI中,因为工作人员再次由YARN管理? - vineet sinha
当没有可用的工作者或者没有足够的可用核心用于工作时,我通常会看到这些错误。 - Saket
你是对的。但是因为我在YARN上运行这个程序,所以这种“主URL”格式可能是错误的。有什么见解吗? - vineet sinha