如何将脚本执行委托给exasol中的不同节点?
How to delegate script execution to different nodes in exasol?
我正在尝试向 exasol 中的 table 添加几百万行,其中一列应该具有递增的整数值 (1 - xmio)。我无法让我的 python 脚本并行到 运行 并将负载分配到集群中的不同节点。因此,该过程需要几天才能完成,这还不够。
由于 CSV-Import 在 exasol 中是并行的,我在本地创建了一个包含 250mio 行的 CSV,将其压缩并上传到 table,这是迄今为止最快的方法,耗时 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 个节点上很容易。不幸的是,我不知道如何连接到其他节点或将脚本执行分配给集群中的特定节点。
您应该 运行 多个节点上的多个脚本实例。实现并行性的最简单方法是创建一个代理 table 包含与您想要的并行进程数一样多的行 运行.
假设我们想要 运行 5 个并行进程。
CREATE TABLE script_parallel
(
proc_id DECIMAL(18,0)
);
INSERT INTO script_parallel VALUES ((1),(2),(3),(4),(5));
您现在可以将此 table 用于 运行 多个脚本实例:
SELECT my_script(proc_id, 5, 250000000)
FROM script_parallel
GROUP BY proc_id
在每个脚本实例中,每隔(第 N 个值 + proc_id)EMIT,最大值为 250000000。每个脚本实例应生成最终结果的较小子集。 Exasol 将为您合并所有实例的结果。
对这种脚本使用 LUA 脚本语言是个好主意。性能将提高 100 倍。
我正在尝试向 exasol 中的 table 添加几百万行,其中一列应该具有递增的整数值 (1 - xmio)。我无法让我的 python 脚本并行到 运行 并将负载分配到集群中的不同节点。因此,该过程需要几天才能完成,这还不够。
由于 CSV-Import 在 exasol 中是并行的,我在本地创建了一个包含 250mio 行的 CSV,将其压缩并上传到 table,这是迄今为止最快的方法,耗时 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 个节点上很容易。不幸的是,我不知道如何连接到其他节点或将脚本执行分配给集群中的特定节点。
您应该 运行 多个节点上的多个脚本实例。实现并行性的最简单方法是创建一个代理 table 包含与您想要的并行进程数一样多的行 运行.
假设我们想要 运行 5 个并行进程。
CREATE TABLE script_parallel
(
proc_id DECIMAL(18,0)
);
INSERT INTO script_parallel VALUES ((1),(2),(3),(4),(5));
您现在可以将此 table 用于 运行 多个脚本实例:
SELECT my_script(proc_id, 5, 250000000)
FROM script_parallel
GROUP BY proc_id
在每个脚本实例中,每隔(第 N 个值 + proc_id)EMIT,最大值为 250000000。每个脚本实例应生成最终结果的较小子集。 Exasol 将为您合并所有实例的结果。
对这种脚本使用 LUA 脚本语言是个好主意。性能将提高 100 倍。