【发布时间】:2017-08-23 14:32:42
【问题描述】:
问题说明了一切。我该如何做以下事情之一:
- 如何限制在集群范围内为一个处理器运行的并发任务数?
- 我运行的节点是否有任何唯一且简短的 ID?我可以使用这些 ID 附加到要加载的数据库表名称(请参阅下面的详细信息)并为每个连接提供一个独占表。
我有一个 NIFI 集群和一个自写的专用处理器,它通过 JDBC 将大量数据加载到数据库中(每秒最多 20Mio 行)。它使用了一些数据库供应商特定的调优技巧,在我的特定情况下非常快。其中一个技巧需要为每个连接加载一个独占的空表。
目前,我的处理器在 NIFI-Cluster 中为每个节点打开一个连接(它需要来自 DBCPConnectionPool 的连接)。集群中有大约 90-100 个节点,我将获得 90-100 个连接 - 所有这些连接都同时批量加载数据。
我使用的是 NIFI 1.3.0.0
非常感谢任何帮助或评论。抱歉没有显示任何代码。大约 700 行并没有真正帮助解决这个问题。但我打算把它放在 Git 上,并作为开源项目 Kylo 的一部分。
【问题讨论】:
-
以 UUID 后缀或类似名称命名的临时表是否适用于您正在使用的 JDBC 批量上传方法?
-
类似 UUID 但更短的东西肯定会有所帮助。原样的 UUID 太长,需要重新格式化才能将其用作表名。知道如何将 UUID 缩短到 10 个或更少的字符吗?
-
我不清楚为什么表名的长度或格式很重要,如果它是一个从不被人或程序查询的临时表,即该表用于批量加载但然后处理所有记录并将其移动到另一个表。如果数据库对名称有格式限制,您总是可以从 uuid 字符串中删除破折号。如果您真的只是更喜欢较短的名称,我想您可以想出一个命名公式来满足您的需求,例如 hostname_threadId 或使用
Thread.currentThread().getId()的类似名称 -
好点。表名的长度限制为 30 个字符,我必须使用两个不同的连接(一个用于加载,一个用于 ELT),因此临时表不起作用。但你是对的。我现在要做的是生成一个随机数的 10 个字符,其中包含表名中所有允许的字符(这是 0-9 和 a-z)。每次我都会得到一个新号码,为每个节点安排处理器。所以这在大多数情况下应该有效。如果真的两个会话获得相同的数字,那么前面运行的脚本将失败,处理器将屈服并再次重试。谢谢你的想法!
-
感谢@jboi 的上下文。我认为你在正确的轨道上......随机字符串在表名冲突时重试。表名中是否允许使用大写字母,表名是否区分大小写?如果是这样,您可能会想出一个基于 base64 编码 UUID 的方案。那将是 22 个字符,您必须用字符替换 [+,]
标签: java apache-nifi kylo