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

时间:2016-02-26 22:02:29

标签: scala hadoop apache-spark cloudera cloudera-manager

我在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() 

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

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

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

Job keeps Running - Spark

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

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

修改

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

5 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:2)

最后想出了答案是什么。

在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运行是行不通的。

答案 2 :(得分:2)

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

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

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

它对我有用。

答案 3 :(得分:0)

除了此处发布的那些错误消息外,还有其他导致此错误消息的原因。

对于spark-on-mesos集群,请确保您在mesos slaves上具有 java8或更高版本 java版本。

对于spark standalone,请确保java8上有workers(或更高版本)。

答案 4 :(得分:-1)

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

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