Как гарантировать эффективное использование ресурсов кластера компанией Futures in spark - PullRequest
0 голосов
/ 04 мая 2018

Я хочу запустить несколько параллельных SQL в одном кластере, чтобы я мог использовать весь ресурсный кластер в ширину кластера. Я использую sqlContext.sql (запрос).

Я видел пример кода здесь , как следует,

val parallelism = 10
val executor = Executors.newFixedThreadPool(parallelism)
val ec: ExecutionContext = ExecutionContext.fromExecutor(executor)
val tasks: Seq[String] = ???
val results: Seq[Future[Int]] = tasks.map(query => {
  Future{
    //spark stuff here
    0
  }(ec)
})
val allDone: Future[Seq[Int]] = Future.sequence(results)
//wait for results
Await.result(allDone, scala.concurrent.duration.Duration.Inf)
executor.shutdown //otherwise jvm will probably not exit 

Как я понял, ExecutionContext вычисляет доступные ядра в машине (используя ForkJoinPool) и соответственно выполняет параллелизм. Но что произойдет, если мы рассмотрим искровой кластер, отличный от отдельной машины, и как он может гарантировать полное использование ресурсов кластера .?

Например: если у меня есть кластер из 10 узлов с каждыми 4 ядрами, то как вышеприведенный код гарантирует, что 40 ядер будут использованы.

редактирует: -

Допустим, нужно выполнить 2 sql, у нас есть 2 способа сделать это

  1. отправлять запросы последовательно, так что второй запрос будет выполнен только после выполнения первого. (потому что sqlContext.sql (запрос) является синхронным вызовом)

  2. Отправьте оба запроса параллельно, используя Futures, чтобы оба запроса выполнялись независимо и параллельно в кластере при условии, что ресурсов достаточно (в обоих случаях).

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

Но, как отметил пользователь9613318, «увеличение размера пула приведет к насыщению драйвера» Тогда как я могу эффективно контролировать потоки для лучшего использования ресурсов.

1 Ответ

0 голосов
/ 04 мая 2018

Параллелизм будет иметь минимальное влияние, и дополнительные ресурсы кластера на самом деле не влияют на подход. Futures (или Threads) используются не для распараллеливания выполнения, а во избежание блокирования выполнения. Увеличение размера пула может только насытить водителя.

Что вы действительно должны посмотреть, так это Spark в приложении планирование пулов и настройка количества разделов для узких ( Как изменить размер раздела в Spark SQL , Что означает параметры partitionColumn, lowerBound, upperBound, numPartitions? ) и wide () Какое должно быть оптимальное значение для spark.sql.shuffle.partitions или как мы можем увеличить разделы при использовании Spark SQL? ) трансформации.

Если задания полностью независимы (структура кода предполагает это), может быть предпочтительнее представлять каждое из них отдельно со своим собственным набором выделенных ресурсов и соответствующим образом настраивать пулы планирования кластера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...