2017-01-12 3 views
0

У меня есть задача, которая выиграет от большего количества ядер, но автономный планировщик запускает ее, когда доступно только подмножество. Я бы предпочел использовать все кластерные ядра для этой задачи.Spark, распределяющий все ядра на задание

Есть ли способ сообщить планировщику завершить все, прежде чем распределять ресурсы для задачи? Другими словами, DAG будет лучше для этой работы, если он закончит все пути до выполнения задачи или дождался появления большего количества ядер. Возможно, намек на то, что задача жирная? Я не и не хочу бегать Пряжа.

Кратко: мне нужно запустить эту задачу карты в противном случае бездействующий кластер, чтобы он имел все ресурсы/ядра. Есть какой-либо способ сделать это? Даже хакерский ответ был бы оценен.

Любые идеи?

+0

«Задача» в искре имеет особое значение, которое сильно отличается от того, для чего вы его используете. «Применение», вероятно, будет лучшим словом. – puhlen

ответ

-1

Вам нужно будет вручную проверить YARN через 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 
    } 
} 

Когда нет ожидающих или запущенных приложений, вы можете запустить свой скрипт. Я бы просто создал сценарий оболочки, который был в цикле while + sleep и ожидал, что они оба будут равны 0.

Вы также можете найти доступную память/ядра. На самом деле я пошел бы по этому маршруту, чтобы вы не всегда ждали, и вы просто гарантируете достаточные ресурсы.

+0

1) скорее не использовать пряжу, 2) это задача внутри Иов. Не уверен в терминологии, но это второй слой в деталях в графическом интерфейсе. Фактически это закрытие одной операции RDD.map и длится вечно, потому что в текущей DAG она получает всего 10 ядер, когда в выделенном кластере более 500. – pferrel

+0

Я неправильно понял вопрос. Итак, вы говорите, что искра использует только 10 из 400 или около того доступных ядер? Если это так, вам нужно убедиться, что у вас одинаковое количество разделов как ядра. Вы можете сделать передел (num_cores) на rdd перед заданием карты и использовать все их, если вы запросили все ядра перед началом задания. –

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 для более подробной информации.

+0

Возможно, я это рассмотрю, спасибо. Но на самом деле у меня есть 384 ядра, все работают отлично, тогда планировщик запускает этот RDD.map, когда доступно только 10, поэтому он берет навсегда, намного дольше, чем требуется для выполнения всех других задач. После всего остального в супер-задаче, которую он установил, он вращается только с 10 ядрами, остальные остаются без дела. – pferrel

+0

Сколько разделов имеет RDD? Автономный планировщик (или YARN) выделяет ресурсы только, но не контролирует поток выполнения. Выполнение - это управление с помощью 'DAGScheduler', а параллелизм зависит от вашего разбиения по большей части –

Смежные вопросы