Искровой подход для выполнения очень небольших работ - PullRequest
0 голосов
/ 26 января 2020

У нас есть 350 небольших таблиц, каждая из которых содержит менее 100 записей .50 больших таблиц, каждая из которых содержит 300 миллионов записей (20 ГБ ИЛИ C размер). мы передаем 1 executor + 1 ядро, 1g памяти исполнителя и 1g памяти драйвера для всех небольших таблиц. Большие таблицы с 10 исполнителями + 10 ядер, 50-граммовая память исполнителя и 2-граммовая память драйвера. При выполнении пакета с балансировкой нагрузки общее время пакетирования увеличивается, а потребление памяти также является максимальным для всего окна пакета. График использования памяти показывает прямоугольник angular один.

Пожалуйста, посоветуйте мне, как справиться с этой ситуацией, чтобы дать очень меньше памяти для очень маленьких таблиц с менее чем 100 записями. каждая таблица One Big размещается для каждых 10 небольших таблиц при отправке из ooz ie, а пакет занимает 3 часа (емкость кластера 6 узлов - каждый с 128 ядрами и общим объемом 1,35 ТБ памяти) с несколькими изменениями в порядке. Посоветуйте, пожалуйста, простой способ запросить меньше памяти в пакете и сократить время с 3 часов.

1 Ответ

0 голосов
/ 26 января 2020

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

// define transformations as (srcTable,targetTable and a transformation function which 
// reads the srcTable and saves the output in the targetTable
val transformations : Seq[(String,String, (String,String) => Unit)] = ???

val batchsize : Int  = ???

transformations
  .grouped(batchsize)
  .foreach(batch => batch.par // parallel job launches!
    .foreach{case (srcTable,tgtTable,transformation) => transformation(srcTable,tgtTable)}
  )
...