当我在 Amazon EMR 上运行的 Spark 作业完成后,为什么 YARN 应用程序仍会使用资源?
上次更新时间:2021 年 6 月 24 日
我在 Amazon EMR 集群上运行 Jupyter 或 Zeppelin 笔记本。即使我提交的 Apache Spark 作业完成以后,YARN 应用程序继续运行。
简短描述
当您在 Zeppelin 或 Jupyter 中运行 Spark 笔记本时,Spark 将作为解释器启动。解释器会创建 YARN 应用程序。此应用程序是您在列举应用程序时显示的 Spark 驱动程序。当您从笔记本结束作业的运行时,驱动程序不会终止。原来的设计便是如此,Spark 驱动程序会保持活动状态,从而让它可以请求应用程序容器动态运行代码。这种设计的缺点是,YARN 应用程序可能正在使用其他作业需要的资源。要解决此问题,您可以手动终止 YARN 应用程序。您也可以设置一个将自动终止应用程序的超时值。
解决方法
Zeppelin
选项 1:重启 Spark 解释器
在开始之前,请确保您拥有在 Zeppelin 中重启解释器的权限。
1. 打开 Zeppelin。
2. 在用户名旁边的下拉列表中,选择 Interpreter(解释器)。
3. 找到 Spark 解释器,然后选择重启。Zeppelin 将在解释器重启时终止 YARN 作业。
选项 2:手动终止 YARN 作业
在开始之前,确保以下事项:
- 您有 Amazon EMR 集群的 SSH 访问权限。
- 您有运行 YARN 命令的权限。
使用 -kill 命令来终止应用程序。在下例中,将 application_id 替换为您的应用程序 ID。
yarn application -kill application_id
选项 3:设置解释器超时值
Zeppelin 版本 0.8.0 及更高版本(Amazon EMR 版本 5.18.0 和更高版本中提供)包含一个解释器生命周期管理程序。使用 TimeoutLifecycleManager 设置以在达到指定的空闲超时期后终止解释器:
1. 创建一个含有以下内容的 etc/Zeppelin/conf/zeppelin-site.xml 文件。在此例中,超时时间段设置为 120,000 毫秒(2 分钟)。选择一个适合您的环境的超时值。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>zeppelin.interpreter.lifecyclemanager.class</name>
<value>org.apache.zeppelin.interpreter.lifecycle.TimeoutLifecycleManager</value>
<description>This is the LifecycleManager class for managing the lifecycle of interpreters. The interpreter terminates after the idle timeout period.</description>
</property>
<property>
<name>zeppelin.interpreter.lifecyclemanager.timeout.checkinterval</name>
<value>60000</value>
<description>The interval for checking whether the interpreter has timed out, in milliseconds.</description>
</property>
<property>
<name>zeppelin.interpreter.lifecyclemanager.timeout.threshold</name>
<value>120000</value>
<description>The idle timeout limit, in milliseconds.</description>
</property>
</configuration>
2. 运行以下命令重启 Zeppelin:
$ sudo stop zeppelin
$ sudo start zeppelin
Jupyter
选项 1:手动关闭笔记本
作业完成后,在 Jupyter 用户界面中使用以下任意一种方法终止内核:
- 在 Jupyter 笔记本界面中,打开 File (文件)菜单,然后选择 Close and Halt(关闭并停止)。
- 在 Jupyter 控制面板中打开运行选项卡。为您要停止的笔记本选择 Shutdown(关机)。
选项 2:手动关闭内核
在 Jupyter 笔记本界面中,打开 Kernel(内核)菜单,然后选择 Shutdown(关机)。
选项 3:配置超时属性
如果您在关闭内核前关闭了笔记本选项卡或浏览器窗口,YARN 作业将继续运行。要防止出现这种情况,请配置 NotebookApp.shutdown_no_activity_timeout 属性。此属性将在达到指定的空闲超时期限后终止 YARN 作业,即使您已经关闭了选项卡或浏览器窗口。
要配置 NotebookApp.shutdown_no_activity_timeout 属性,请执行以下操作:
1. 在主节点上打开 /etc/jupyter/jupyter_notebook_config.py 文件,然后添加一个与以下类似的条目。在此例中,超时属性设置为 120 秒。选择一个适合您的环境的超时值。
c.NotebookApp.shutdown_no_activity_timeout = 120
2. 运行以下命令重启 jupyterhub:
sudo docker stop jupyterhub
sudo docker start jupyterhub