应用程序报告对于Spark Submit(使用Spark 1.2.0 on YARN)的应用程序(状态:已接受)永远不会结束。

51

我正在运行 Kinesis 加 Spark 应用程序 https://spark.apache.org/docs/1.2.0/streaming-kinesis-integration.html

以下是在 EC2 实例上的运行命令:

 ./spark/bin/spark-submit --class org.apache.spark.examples.streaming.myclassname --master yarn-cluster --num-executors 2 --driver-memory 1g --executor-memory 1g --executor-cores 1  /home/hadoop/test.jar 

我已在EMR上安装了Spark。

EMR details
Master instance group - 1   Running MASTER  m1.medium   
1

Core instance group - 2 Running CORE    m1.medium

我收到以下INFO并且它从未停止。

15/06/14 11:33:23 INFO yarn.Client: Requesting a new application from cluster with 2 NodeManagers
15/06/14 11:33:23 INFO yarn.Client: Verifying our application has not requested more than the maximum memory capability of the cluster (2048 MB per container)
15/06/14 11:33:23 INFO yarn.Client: Will allocate AM container, with 1408 MB memory including 384 MB overhead
15/06/14 11:33:23 INFO yarn.Client: Setting up container launch context for our AM
15/06/14 11:33:23 INFO yarn.Client: Preparing resources for our AM container
15/06/14 11:33:24 INFO yarn.Client: Uploading resource file:/home/hadoop/.versions/spark-1.3.1.e/lib/spark-assembly-1.3.1-hadoop2.4.0.jar -> hdfs://172.31.13.68:9000/user/hadoop/.sparkStaging/application_1434263747091_0023/spark-assembly-1.3.1-hadoop2.4.0.jar
15/06/14 11:33:29 INFO yarn.Client: Uploading resource file:/home/hadoop/test.jar -> hdfs://172.31.13.68:9000/user/hadoop/.sparkStaging/application_1434263747091_0023/test.jar
15/06/14 11:33:31 INFO yarn.Client: Setting up the launch environment for our AM container
15/06/14 11:33:31 INFO spark.SecurityManager: Changing view acls to: hadoop
15/06/14 11:33:31 INFO spark.SecurityManager: Changing modify acls to: hadoop
15/06/14 11:33:31 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(hadoop); users with modify permissions: Set(hadoop)
15/06/14 11:33:31 INFO yarn.Client: Submitting application 23 to ResourceManager
15/06/14 11:33:31 INFO impl.YarnClientImpl: Submitted application application_1434263747091_0023
15/06/14 11:33:32 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:32 INFO yarn.Client:
         client token: N/A
         diagnostics: N/A
         ApplicationMaster host: N/A
         ApplicationMaster RPC port: -1
         queue: default
         start time: 1434281611893
         final status: UNDEFINED
         tracking URL: http://172.31.13.68:9046/proxy/application_1434263747091_0023/
         user: hadoop
15/06/14 11:33:33 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:34 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:35 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:36 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:37 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:38 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:39 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:40 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)
15/06/14 11:33:41 INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)

有人可以告诉我为什么它不起作用吗?


也许移除 setMaster("local[*]") - Hille
13个回答

24

当我们的集群上有多个用户同时运行时,我遇到了这个确切的问题。解决方法是更改调度程序的设置。

在文件/etc/hadoop/conf/capacity-scheduler.xml中,我们将属性yarn.scheduler.capacity.maximum-am-resource-percent0.1更改为0.5

更改此设置增加了可用于分配给应用程序管理器的资源比例,因此增加了可能同时运行的管理器数量,从而增加了可能并发运行的应用程序数量。


只想补充一下,如果您在单台机器上运行集群且资源有限,则设置此参数非常重要。 - Michael
我正在使用HUE工作,我也遇到了同样的问题。请问我在哪里可以找到capacity-scheduler.xml文件? - user5227388
对我很有效。现在可以同时运行多个Spark应用程序了。 - Sangram Gaikwad
@user5227388 sudo find / -name capacity-scheduler.xml@user5227388 sudo查找/ -name容量调度程序.xml - user1

14

在这种情况下,我遇到了以下错误:

  1. MASTER=yarn(或yarn-client)
  2. spark-submit运行在集群外的计算机上,由于路由器的隐藏,集群无法与其建立联系。

来自container_1453825604297_0001_02_000001的日志(从ResourceManager web UI):

16/01/26 08:30:38 INFO yarn.ApplicationMaster: 等待Spark driver可达。
16/01/26 08:31:41 ERROR yarn.ApplicationMaster: 无法连接到192.168.1.180:33074处的driver,正在重试……
16/01/26 08:32:44 ERROR yarn.ApplicationMaster: 无法连接到192.168.1.180:33074处的driver,正在重试……
16/01/26 08:32:45 ERROR yarn.ApplicationMaster: 未捕获的异常:
org.apache.spark.SparkException: 无法连接到driver!
    at org.apache.spark.deploy.yarn.ApplicationMaster.waitForSparkDriver(ApplicationMaster.scala:484) 

我通过使用yarn cluster模式来解决这个问题: MASTER=yarn-cluster。

在另一台配置相似但IP地址可以从集群中访问的计算机上,yarn-client和yarn-cluster均可工作。

其他人可能因不同原因遇到此错误,我的观点是几乎总是通过检查错误日志(在此情况下不是从终端看到的,而是ResourceManager web UI)可以找到帮助。


与您的情况相同,此问题应该是路由表问题。 - Keith
感谢您的解释! - frb

10

我们有三种方法可以尝试解决这个问题。

  1. 检查您的计算机上是否有Spark进程并将其关闭。

执行以下操作:

ps aux | grep spark

获取所有带有Spark进程的进程ID并将它们全部杀掉,例如:
sudo kill -9 4567 7865
  1. 检查您的集群上运行的Spark应用程序数量。

要进行检查,请执行以下操作:

yarn application -list

您将会得到类似于以下输出的结果:
Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):1
                Application-Id      Application-Name        Application-Type          User       Queue               State         Final-State         Progress                        Tracking-URL
application_1496703976885_00567       ta da                SPARK        cloudera       default             RUNNING           UNDEFINED              20%             http://10.0.52.156:9090

检查应用程序ID,如果它们超过1个或2个以上,请将其终止。您的集群不能同时运行超过2个Spark应用程序。我不能100%确定,但是在集群上如果运行超过两个Spark应用程序,它会开始抱怨。因此,请将它们终止。

执行以下操作以将它们终止:

yarn application -kill application_1496703976885_00567
  1. 检查您的Spark配置参数。 例如,如果您在Spark应用程序中设置了更多的执行器内存、驱动程序内存或执行器数量,可能会导致问题。因此,请减少其中任何一个,并运行您的Spark应用程序,这可能会解决问题。

6
这表明YARN无法为您提交的新应用程序分配资源。尝试减少您请求的容器资源(请参见此处),或在负载较轻的集群上尝试。另一个尝试的方法是检查YARN是否正常作为服务运行:
sudo service hadoop-yarn-nodemanager status
sudo service hadoop-yarn-resourcemanager status

我必须启动我的yarn-nodemngr。谢谢! - Abhi

3
我曾经有一个小集群,资源非常有限(每个节点大约只有3GB内存)。通过将最小内存分配更改为足够低的数字来解决这个问题。
来自:
yarn.scheduler.minimum-allocation-mb: 1g
yarn.scheduler.increment-allocation-mb: 512m

To:

yarn.scheduler.minimum-allocation-mb: 256m
yarn.scheduler.increment-allocation-mb: 256m

我正在使用HUE工作,我也遇到了同样的问题。我需要在哪里更改上面的代码? - user5227388

1
我使用CDH 5.4进行了略微不同的设置。我认为在我的设置中,这个问题的原因是由于某些错误(文件已经存在等)导致卡住了,因为这发生在我的代码的其他部分出现错误并尝试修复并再次启动后。
我可以通过在Cloudera Manager上重新启动群集中的所有服务来解决这个问题,所以我同意之前的答案,这可能是由于资源被分配给出现错误的内容,并且需要重新获取这些资源才能再次运行,或者一开始就分配它们。
例如,我的群集有4个可用执行器。对于一个进程的SparkConf,我将spark.executor.instances设置为4。当该进程仍在运行时,由于某种原因可能被挂起,我会启动另一个作业(以相同的方式或使用spark-submit),并将spark.executor.instances设置为1(如果使用spark-submit,则为“--num-executors 1”)。我只有4个执行器,并且4个被分配给较早的进程,因此请求1个执行器的这个进程必须排队等待。

1
在我这里,我发现一些旧的Spark进程(通过Ctrl+Z停止)仍在运行,它们的AppMaster(驱动程序)可能仍然占用内存。因此,新的spark命令中的AppMaster可能会无限期地等待被YarnScheduler注册,因为在各个核心节点上可能无法分配spark.driver.memory。当Max资源分配为true且驱动程序设置为使用核心节点可用的最大资源时,也可能会出现这种情况。
因此,我识别了所有那些陈旧的Spark客户端进程并杀死了它们(这可能已经杀死了它们的Drivers并释放了内存)。
ps -aux | grep spark

hadoop    3435  1.4  3.0 3984908 473520 pts/1  Tl   Feb17   0:12  .. org.apache.spark.deploy.SparkSubmit --conf spark.driver.memory=1G --class org.apache.spark.examples.SparkPi /usr/lib/spark/lib/spark-examples.jar 10

hadoop   32630  0.9  3.0 3984908 468928 pts/1  Tl   Feb17   0:14 .. org.apache.spark.deploy.SparkSubmit --conf spark.driver.memory=1G --class org.apache.spark.examples.SparkPi /usr/lib/spark/lib/spark-examples.jar 1000

    kill -9 3435 32630

之后我就看不到那些消息了。

如果您正在运行Yarn,则可以使用yarn application -kill <appilication-ID>命令来停止应用程序。如果在本地运行,则可以在端口8088上检查作业的状态,将浏览器指向localhost:8088即可。当我在本地开发时,有时会同时运行Hive会话或Zeppelin作业,因此需要先终止它们,然后才能执行Spark作业。 - Hendrik F

0

在使用yarn-cluster运行时,所有应用程序日志和标准输出都将位于指定的yarn应用程序主节点中,并且不会显示在spark-submit中。由于通常是流式处理应用程序,因此该应用程序通常不会退出。请检查Hadoop资源管理器Web界面,并查看从Hadoop UI可用的Spark Web UI和日志。


即使应用程序已经结束(非流式批处理作业),这个问题似乎仍然存在。 - marios

0

我在一个本地的Hadoop集群上,使用Spark 1.4和Yarn运行spark-shell时遇到了同样的问题。它有足够的资源。

解决方法是在集群上从交互式LSF作业中运行相同的内容。也许从头节点运行yarn存在一些网络限制...


0

我在MS Azure的HDinsight spark集群中遇到了同样的问题。
最终发现问题是集群无法与驱动程序进行双向通信。 我假设您在提交作业时使用了客户端模式,因为您可以提供此调试日志。

原因是spark执行程序必须与驱动程序进行通信,并且TCP连接必须是双向的。因此,如果您的驱动程序运行在无法通过主机名或IP(您必须在spark conf中指定,默认为主机名)访问的VM(ec2实例)中,则您的状态将永远被接受。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接