首页 > 解决方案 > Talend 是 OnComponantOk 线程安全的

问题描述

我有一个关于 Talend 并行性的问题,我正在构建一个 ETL,它可以并行删除多个文件,然后更新一个 db 表。

我的工作运行 tFlowToIterate === 并行迭代 x10 ===> tDelete ===OnComponanantOK===> tDBRow

我的 tDBRow 需要在 tFlowToIterate 中定义的变量才有效!但是我不清楚它为什么起作用的逻辑???Talend 如何确保 tDBrow 在此情况下具有适当的值?

我的理论是 OnCompnanatOk 链接上的 tDBRow 就像一个孩子在 tDelete 迭代下的作品

谁能解释这是如何/为什么起作用的?

标签: javatalend

解决方案


当 talend 启动一个新线程时,它会创建 globalMap 的副本,您的值在 globalMap 中,因此每个 DBRow 将有自己的 globalMap。(如果您在 globalMap 中存储大量数据,这可能会导致更高的内存使用。)

您需要注意的是另一个方向,因为 globalMap 是写入同步的。因此,如果您在线程内为其设置一个值,它也会被写入父级。在现实生活中,这意味着如果您尝试在 globalMap 中增加一个变量,您的并行线程将看到值 0 并写回 1。因此第 11 步将从 1 开始。

因此,如果你想避免这种情况,(例如 put (hadError, true) 然后稍后检查 hadError,当线程启动时,请确保初始化那些你想在线程中依赖的值。或者如果逻辑更复杂,那么使该子作业成为新作业,因此 globalMap 不会损坏。


推荐阅读