0

我有一个任务可以从更多内核中受益,但是当只有一个子集可用时,独立调度程序会启动它。我宁愿在这个任务上使用所有集群核心。

有没有办法告诉调度程序在将资源分配给任务之前完成所有事情?换句话说,如果 DAG 在执行任务之前结束所有路径或等待更多内核可用,则 DAG 会更好地完成这项工作。也许是暗示一项任务很胖的一种方式?我不是也不希望运行 Yarn。

简而言之:我需要在其他空闲集群上运行此地图任务,以便它拥有所有资源/核心。有没有办法做到这一点?即使是一个骇人听闻的答案也将不胜感激。

有任何想法吗?

4

2 回答 2

0

动态资源分配可能是您正在寻找的。它根据工作负载向上和向下扩展在此应用程序中注册的执行程序的数量。

您可以通过将配置参数传递给 SparkSession 来启用它,例如:

val spark = SparkSession
  .builder()
  .appName("MyApp")
  .config("spark.dynamicAllocation.enabled","true")
  .config("spark.shuffle.service.enabled","true")
  .getOrCreate()

有关更多详细信息,请参见:http ://spark.apache.org/docs/latest/job-scheduling.html#dynamic-resource-allocation 。

于 2017-01-13T02:03:32.290 回答
-1

您必须通过 REST api 手动检查 YARN 以查看何时没有应用程序在运行。

GET http://<rm http address:port>/ws/v1/cluster/metrics
{
  "clusterMetrics":
  {
  "appsSubmitted":0,
  "appsCompleted":0,
  "appsPending":0,
  "appsRunning":0,
  "appsFailed":0,
  "appsKilled":0,
  "reservedMB":0,
  "availableMB":17408,
  "allocatedMB":0,
  "reservedVirtualCores":0,
  "availableVirtualCores":7,
  "allocatedVirtualCores":1,
  "containersAllocated":0,
  "containersReserved":0,
  "containersPending":0,
  "totalMB":17408,
  "totalVirtualCores":8,
  "totalNodes":1,
  "lostNodes":0,
  "unhealthyNodes":0,
  "decommissionedNodes":0,
  "rebootedNodes":0,
  "activeNodes":1
  }
}

当没有待处理或正在运行的应用程序时,您可以运行您的脚本。我只会创建一个处于 while 循环 + 睡眠中的 shell 脚本,然后等待它们都为 0。

您也可以寻找可用的内存/内核。事实上,我会走那条路,这样你就不会总是在等待,你只需保证足够的资源。

于 2017-01-12T23:22:51.783 回答