Apache spark Spark将所有内核分配给一个任务

Apache spark Spark将所有内核分配给一个任务,apache-spark,yarn,apache-spark-standalone,Apache Spark,Yarn,Apache Spark Standalone,我有一个任务将受益于更多的内核,但独立调度器在只有一个子集可用时启动它。我宁愿在这个任务中使用所有集群核心 在将资源分配给任务之前,是否有方法告诉调度程序完成所有任务?换句话说,如果DAG在执行任务之前结束所有路径或等待更多内核可用,则DAG更适合此作业。也许是一种暗示任务很繁重的方式?我不是,也不想经营纱线 简而言之:我需要在一个空闲集群上运行这个映射任务,这样它就拥有了所有的资源/核心。有没有办法做到这一点?即使是粗鲁的回答也会很感激 有什么想法吗?您必须通过REST api手动检查纱线,以

我有一个任务将受益于更多的内核,但独立调度器在只有一个子集可用时启动它。我宁愿在这个任务中使用所有集群核心

在将资源分配给任务之前,是否有方法告诉调度程序完成所有任务?换句话说,如果DAG在执行任务之前结束所有路径或等待更多内核可用,则DAG更适合此作业。也许是一种暗示任务很繁重的方式?我不是,也不想经营纱线

简而言之:我需要在一个空闲集群上运行这个映射任务,这样它就拥有了所有的资源/核心。有没有办法做到这一点?即使是粗鲁的回答也会很感激


有什么想法吗?

您必须通过REST api手动检查纱线,以查看何时没有应用程序运行

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
  }
}
GEThttp:///ws/v1/cluster/metrics
{
“clusterMetrics”:
{
“appsSubmitted”:0,
“appsCompleted”:0,
“应用程序支出”:0,
“应用程序运行”:0,
“appsFailed”:0,
“appsKilled”:0,
“reservedMB”:0,
“可用EMB”:17408,
“allocatedMB”:0,
“reservedVirtualCores”:0,
“可用虚拟资源”:7,
“分配的虚拟资源”:1,
“已分配集装箱”:0,
“保留集装箱”:0,
“containersPending”:0,
“totalMB”:17408,
“totalVirtualCores”:8,
“totalNodes”:1,
“lostNodes”:0,
“不健康节点”:0,
“停用节点”:0,
“重新启动的节点”:0,
“活动节点”:1
}
}
如果没有挂起或正在运行的应用程序,则可以运行脚本。我只需要创建一个处于while循环+sleep中的shell脚本,并等待它们都为0


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

动态资源分配可能就是你想要的。它根据工作负载上下扩展在此应用程序中注册的执行者的数量

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

val spark = SparkSession
  .builder()
  .appName("MyApp")
  .config("spark.dynamicAllocation.enabled","true")
  .config("spark.shuffle.service.enabled","true")
  .getOrCreate()
见此:
有关更多详细信息。

spark中的“任务”有一个特定的含义,与您使用它的目的截然不同。“应用程序”可能是一个更好的词。1)不要使用纱线,2)这是工作中的一项任务。不确定术语,但它是GUI上详细信息的第二层。这实际上是一个RDD.map操作的结束,需要花费很长时间,因为在当前的DAG中,当专用集群中有500多个内核时,它只能获得10个内核。我误解了这个问题。你是说spark只使用了400个左右可用内核中的10个?如果是这种情况,您需要确保分区的数量与内核的数量相同。在地图任务之前,你可以在RDD上重新分区(NUMYCULL),然后使用它们,只要你在开始工作之前请求所有的内核。也许,我会考虑的,谢谢。但实际上我有384个内核,都可以很好地工作,然后调度器在只有10个可用时启动这个RDD.map,所以它需要永远,比完成所有其他任务所需的时间要长得多。在超级任务中完成所有其他任务后,它设置在那里,只剩下10个内核,其余的空闲。RDD有多少个分区?独立调度器(或纱线)仅分配资源,但不控制执行流。执行由
DAGScheduler
控制,并行性在很大程度上取决于分区