如何将脚本执行委托给exasol中的不同节点?

2024-10-06 12:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试向exasol中的一个表中添加几百万行,其中一列应该具有递增的整数值(1-xmio)。我无法让python脚本并行运行并将负载分配给集群中的不同节点。正因为如此,这个过程需要几天才能完成,这是不够的。你知道吗

由于CSV导入在exasol中是并行的,所以我在本地创建了一个包含2.5亿行的CSV,将其压缩并上传到表中,这是迄今为止最快的方法,耗时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分钟

我明白,脚本不能像现在这样并行运行。将它划分为50Mio块并在5个节点上运行是很容易的。不幸的是,我不知道如何连接到其他节点或将脚本执行分配给集群中的特定节点。你知道吗


Tags: to方法import脚本none节点createscript
1条回答
网友
1楼 · 发布于 2024-10-06 12:27:05

您应该在多个节点上运行脚本的多个实例。实现并行性的最简单方法是创建一个代理表,其中包含的行数与要运行的并行进程数相同。你知道吗

假设我们要运行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

在每个脚本实例内部,发射间隔(第n个值+进程id),最大值为250000000。每个脚本实例都应该生成最终结果的较小子集。Exasol将为您合并所有实例的结果。你知道吗

对于这类脚本,最好使用LUA脚本语言。性能将提高100倍。你知道吗

相关问题 更多 >