我有一项任务可以从更多核心中受益,但是当只有一个子集可用时,独立调度程序会启动它。我宁愿在这项任务中使用所有集群核心。
有没有办法告诉调度程序在为任务分配资源之前完成所有操作?换句话说,如果DAG在执行任务之前结束所有路径或等待更多核心可用,那么DAG对这项工作会更好。也许是一种暗示任务肥胖的方法?我不是也不想跑纱。
简洁:我需要在一个空闲的群集上运行此map任务,以便它拥有所有资源/核心。有没有办法做到这一点?即使是一个hacky的答案也会受到赞赏。
有什么想法吗?
答案 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。
您也可以查找可用的内存/内核。事实上,我会走那条路,这样你就不会总是在等待,而你只是保证足够的资源。