首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将脚本执行委托给exasol中的不同节点?

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

Stack Overflow用户
提问于 2019-05-07 16:25:49
回答 1查看 196关注 0票数 0

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

由于CSV-Import在exasol中是并行的,我在本地创建了一个250mio行的CSV,将其压缩并上传到表中,这是迄今为止最快的方法,需要7分钟(瓶颈是我的上传速度)。

其他方法:

代码语言:javascript
复制
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);

非常幼稚的方法,因为插入很慢,需要数年才能完成

代码语言:javascript
复制
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个节点上运行将非常容易。不幸的是,我不知道如何连接到其他节点,或者如何将脚本执行分配给集群中的特定节点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-09 22:25:17

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

假设我们想要运行5个并行进程。

代码语言:javascript
复制
CREATE TABLE script_parallel
(
    proc_id DECIMAL(18,0)
);

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

现在,您可以使用此表运行脚本的多个实例:

代码语言:javascript
复制
SELECT my_script(proc_id, 5, 250000000)
FROM script_parallel
GROUP BY proc_id

在每个脚本实例中,每隔(第N个值+ proc_id)发出一次,最大值为250000000。每个脚本实例都应该生成较小的最终结果子集。Exasol将为您合并所有实例的结果。

对这类脚本使用LUA脚本语言是个好主意。性能将提高100倍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56018436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档