Как запустить 2 EMR Spark Step одновременно?

Я пытаюсь запустить 2 шага одновременно в EMR. Однако я всегда выполняю первый шаг и второй ожидающий.

Часть моей конфигурации пряжи выглядит следующим образом:

{
    "Classification": "capacity-scheduler",
    "Properties": {
    "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator",
    "yarn.scheduler.capacity.maximum-am-resource-percent": "0.5"
    }
  }

Когда я работаю на своем локальном Mac, я могу запустить приложение 2 на Yarn с аналогичной конфигурацией, где изменения на самом деле представляют собой запрос на отправку с использованием искры, чтобы соответствовать требуемой емкости и производительности кластера.

Другими словами, My пряжа настроена для запуска нескольких приложений.

Следовательно, прежде чем я углублюсь в это, я задаюсь вопросом, возможно ли на самом деле сделать шаг одновременно или только последовательно?

Еще есть какие-то советы или что-то конкретное, чтобы работать на работу одновременно?

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

1 ответ

  • Можно ли выполнить шаг одновременно или только последовательно?

    • Сотрудники службы поддержки AWS подтвердили, что мы не можем выполнять несколько шагов параллельно (одновременно), эти шаги являются последовательными, поэтому ожидается то, что вы видите (т.е. вторая работа в состоянии ожидания).
  • Есть ли какие-то советы или что-то конкретное, чтобы работать одновременно?

    • Вы можете просто вставить как spark-submit в скрипт bash, так и запустить скрипт bash, но вы можете потерять некоторую информацию о прямой отладке в веб-консоли AWS (которая уже работает медленно), вы можете увидеть эту информацию отладки на spark-history server

On your local mac, you are able to run multiple YARN application in parallel because you are submitting the applications to yarn directly, whereas in EMR the yarn/spark applications are submitted through AWS's internal `command-runner.jar`, it does a bunch of other logging/bootstrapping etc to be able to see the `emr step` info on the web console.

Похоже, AWS наконец-то реализовала эту функцию в EMR 5.28.0!

Параметр называется "Параллелизм" в мастере консоли или StepConcurrencyLevel в API:

Задает количество шагов, которые могут выполняться одновременно. Значение по умолчанию - 1. Максимальное значение - 256.

В AWS EMR Yarn есть 2 режима работы приложения:

  • клиент
  • кластер

Если вы используете режим клиента, тогда только один шаг будет в состоянии выполнения в данный момент времени. Однако есть вариант, при котором вы можете выполнить более 1 шага одновременно.

попробуйте отправить свой шаг в режиме удара: spark-submit --master yarn --deploy-mode cluster --executor-memory 1G --num-executors 2 --driver-memory 1g --executor-cores 2 --conf spark.yarn.submit.waitAppCompletion=false --класс WordCount.word.App /home/hadoop/word.jar

  1. Вместо того чтобы позволить AWS EMR определять распределение памяти, попробуйте определить ваше распределение. Обратитесь по ссылке: http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/
  2. spark.yarn.submit.waitAppCompletion = false: в режиме кластера YARN определяет, ожидает ли клиент выхода из системы до завершения приложения. Если установлено значение true, клиентский процесс будет оставаться в живых, сообщая о состоянии приложения. В противном случае клиентский процесс завершится после отправки.

Надеюсь, что это может помочь вам.

AWS теперь позволяет выполнять шаги одновременно в более поздних версиях EMR. https://aws.amazon.com/about-aws/whats-new/2019/11/amazon-emr-now-allows-you-to-run-multiple-steps-in-parallel-cancel-running-steps-and-integrate-with-aws-step-functions/

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

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

step-job.sh

#!/bin/bash

function main(){
    do_this
    do_that
}

if [[ "$1" == "1" ]]; then
    main
else
    /bin/bash "$0" 1 $@ &
fi
Другие вопросы по тегам