Как делегировать выполнение скрипта различным узлам в exasol? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь добавить пару миллионов строк в таблицу в exasol. Предполагается, что один столбец имеет целочисленные значения (1 - xmio).Я не могу заставить мой скрипт на python работать параллельно и распределять нагрузку по разным узлам в кластере.Из-за этого процесс занимает несколько дней, но этого недостаточно.

Поскольку CSV-импорт параллелен в exasol, я создал CSV с 250-миллионными строками локально, заархивировал его и загрузил в таблицу, это былосамый быстрый подход, который занимает 7 минут (из-за моей скорости загрузки).

Другие подходы:

CREATE SCRIPT BIG1 (bound) AS
    i = 0
    while i < bound do
        query([[insert into USER_XXXXX.BIG values (:n, null, null, null, null, null)]], {n=i})
        i = i+1
    end
/
EXECUTE SCRIPT BIG1(250000000);

Очень наивный подход, потому что вставка медленная, для ее завершения требуются годы

CREATE PYTHON SCALAR SCRIPT USER_XXXXX.BIG2 ("AMOUNT_TO_CREATE" DECIMAL(18,0))
        EMITS (val DECIMAL(18,0), val BOOLEAN, val BOOLEAN, val BOOLEAN, val BOOLEAN, val BOOLEAN) AS
def generate_sql_for_import_spec(import_spec):
 return "SELECT USER_XXXXX.BIG2("+import_spec.parameters["AMOUNT_TO_CREATE"]+")"

def run(ctx):
 for i in range(1, ctx.AMOUNT_TO_CREATE + 1):
  ctx.emit(i, None, None, None, None, None)
/

IMPORT INTO USER_XXXXX.BIG FROM SCRIPT USER_XXXXX.BIG2 WITH AMOUNT_TO_CREATE='250000000';

Работает лучше и полностью работает на сервере.Выполнение занимает около 33 минут

Я понимаю, что скрипт не может работать параллельно как есть.Было бы легко разделить его на 50-миллионные блоки и запустить на 5 узлах.К сожалению, я понятия не имею, как подключиться к другим узлам или назначить выполнение скрипта конкретным узлам в кластере.

1 Ответ

1 голос
/ 09 мая 2019

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

Предположим, мы хотим запустить 5 параллельных процессов.

CREATE TABLE script_parallel
(
    proc_id DECIMAL(18,0)
);

INSERT INTO script_parallel VALUES ((1),(2),(3),(4),(5));

Вы можете использовать эту таблицу для запуска нескольких экземпляров скрипта:

SELECT my_script(proc_id, 5, 250000000)
FROM script_parallel
GROUP BY proc_id

Внутри каждого экземпляра скрипта EMIT каждые (N-е значение + proc_id) до максимального значения 250000000. Каждый экземпляр скрипта должен генерировать меньшее подмножество конечного результата. Exasol объединит результаты всех инстанций для вас.

Хорошей идеей является использование языка сценариев LUA для таких сценариев. Производительность будет в 100 раз лучше.

...