Spark将所有核心分配给任务

时间:2017-01-12 18:33:25

标签: apache-spark yarn apache-spark-standalone

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

有没有办法告诉调度程序在为任务分配资源之前完成所有操作?换句话说,如果DAG在执行任务之前结束所有路径或等待更多核心可用,那么DAG对这项工作会更好。也许是一种暗示任务肥胖的方法?我不是也不想跑纱。

简洁:我需要在一个空闲的群集上运行此map任务,以便它拥有所有资源/核心。有没有办法做到这一点?即使是一个hacky的答案也会受到赞赏。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

动态资源分配可能就是您要寻找的。它根据工作负载上下调整使用此应用程序注册的执行程序数。

您可以通过将config参数传递给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 了解更多详情。

答案 1 :(得分:-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循环+ sleep中的shell脚本,并等待它们都为0。

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