Amazon EMR-如何为一步设置超时



是否有一种方法可以为Amazon AWS AWS emr step a 设置 timeout

我在EMR上运行批处理Apache Spark作业,如果在3个小时内没有结束,我希望工作停止。

我找不到在Spark中设置超时不是的方法

感谢您的帮助!

我想提供一种替代方法,而没有任何超时/关闭逻辑使应用程序本身比需要的更复杂 - 尽管我显然对聚会很晚。也许这对将来的人有用。

您可以:

  • 编写一个Python脚本,并将其用作常规纱线命令的包装器
  • 通过子过程LIB执行这些纱线命令
  • 根据您的意愿解析其输出
  • 决定应杀死哪些纱线申请

有关我在说什么的更多详细信息...

Python包装脚本并通过子过程LIB

运行纱线命令
import subprocess
running_apps = subprocess.check_output(['yarn', 'application', '--list', '--appStates', 'RUNNING'], universal_newlines=True)

此片段将为您提供类似于类似内容的输出:

Total number of applications (application-types: [] and states: [RUNNING]):1
                Application-Id      Application-Name                                Application-Type          User       Queue               State         Final-State         Progress                        Tracking-URL
application_1554703852869_0066      HIVE-645b9a64-cb51-471b-9a98-85649ee4b86f       TEZ                       hadoop     default             RUNNING       UNDEFINED           0%                              http://ip-xx-xxx-xxx-xx.eu-west-1.compute.internal:45941/ui/

您可以比解析此输出(当心可能有多个应用程序运行(并提取应用程序ID值。

然后,对于每个应用程序ID,您可以调用另一个纱线命令以获取有关特定应用程序的更多详细信息:

app_status_string = subprocess.check_output(['yarn', 'application', '--status', app_id], universal_newlines=True)

此命令的输出应该是这样的:

Application Report :
  Application-Id : application_1554703852869_0070
  Application-Name : com.organization.YourApp
  Application-Type : HIVE
  User : hadoop
  Queue : default
  Application Priority : 0
  Start-Time : 1554718311926
  Finish-Time : 0
  Progress : 10%
  State : RUNNING
  Final-State : UNDEFINED
  Tracking-URL : http://ip-xx-xxx-xxx-xx.eu-west-1.compute.internal:40817
  RPC Port : 36203
  AM Host : ip-xx-xxx-xxx-xx.eu-west-1.compute.internal
  Aggregate Resource Allocation : 51134436 MB-seconds, 9284 vcore-seconds
  Aggregate Resource Preempted : 0 MB-seconds, 0 vcore-seconds
  Log Aggregation Status : NOT_START
  Diagnostics :
  Unmanaged Application : false
  Application Node Label Expression : <Not set>
  AM container Node Label Expression : CORE

拥有此功能,您还可以提取应用程序的启动时间,将其与当前时间进行比较,然后查看它运行的时间。如果它运行的时间超过了一些阈值分钟数,例如您杀死它。

您如何杀死它?容易。

kill_output = subprocess.check_output(['yarn', 'application', '--kill', app_id], universal_newlines=True)

从杀死步骤/应用程序的角度来看,应该是这样。

自动化方法

aws emr具有一个出色的功能,称为" Bootstrap Action"。它在EMR群集创建上运行一组动作,可以用于自动化此方法。

将BASH脚本添加到Bootstrap Action中,该操作将:

  • 下载您刚写入群集(主节点(
  • 的Python脚本
  • 将Python脚本添加到crontab

应该是。

P.S。我以为python3为此目的是为我们提供的。

好吧,正如许多人已经回答的那样,此刻无法通过API呼叫杀死/停止/终止EMR步骤。

但是,为了实现您的目标,您可以将超时作为应用程序代码本身的一部分。当您提交EMR步骤时,将创建一个子进程以运行您的应用程序 - 无论是MAPREDUCE应用程序,SPARK应用程序等,并且步骤完成由此子进程(这是您的应用程序(返回的退出代码确定。

例如,如果要提交MapReduce应用程序,则可以使用以下内容:

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
final Runnable stuffToDo = new Thread() {
  @Override 
  public void run() { 
    job.submit();
  }
};
final ExecutorService executor = Executors.newSingleThreadExecutor();
final Future future = executor.submit(stuffToDo);
executor.shutdown(); // This does not cancel the already-scheduled task.
try { 
  future.get(180, TimeUnit.MINUTES); 
}
catch (InterruptedException ie) { 
  /* Handle the interruption. Or ignore it. */ 
}
catch (ExecutionException ee) { 
  /* Handle the error. Or ignore it. */ 
}
catch (TimeoutException te) { 
  /* Handle the timeout. Or ignore it. */ 
}
System.exit(job.waitForCompletion(true) ? 0 : 1);

参考-Java:在某个代码块上设置超时?

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新