java - 我可以强制数据流管道中的步骤为单线程(并且在单台计算机上)吗?

标签 java google-cloud-platform google-cloud-dataflow apache-beam thread-synchronization

我有一个管道,它获取文件的 URL,并下载这些文件,为除 header 之外的每一行生成 BigQuery 表行。

为了避免重复下载,我想对照之前下载的 URL 表检查 URL,并且仅在该“历史记录”表中尚不存在该 URL 时才继续存储该 URL。

为此,我需要将历史记录存储在允许唯一值的数据库中,或者使用 BigQuery 也可能更容易,但对表的访问必须严格是串行的。

我可以强制执行单线程执行(在一台机器上)来满足仅部分管道的要求吗?

(在此之后,我的 100 个 URL/文件中的每一个都适合在单独的线程上处理;每个文件都会产生 10000-10000000 行,因此此时的限制几乎肯定不会产生性能问题。 )

最佳答案

Beam 专为并行处理数据而设计,它会尝试显式阻止您同步或阻塞,除非使用一些内置原语,例如 Combine .

听起来您想要的是一个过滤器,仅在第一次看到元素(您的 URL)时才发出该元素。您也许可以使用内置的 Distinct transform为了这。此运算符使用“Combine per-key”按键(在本例中为您的 URL)对元素进行分组,然后仅在第一次看到每个键时发出每个键。

关于java - 我可以强制数据流管道中的步骤为单线程(并且在单台计算机上)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57360621/

相关文章:

java - Spring 值 : incorrect shows fields

google-cloud-platform - 带有python flex模板的数据流 - 启动器超时

java - 使用 Google Dataflow 在批处理模式下使用 KafkaIO 进行消费

java - DataflowRunner 需要 gcpTempLocation,但无法从 PipelineOptions 检索值

java - Gson 反序列化 - 尝试将 JSON 解析为对象

java - 在 Java 中迭代集合时递增值时出现奇怪的错误

java - ImageMagick 转换退出状态 133

google-cloud-platform - 谷歌云 : Compute VM Instances; can't sudo anymore

kubernetes - 如何在 gke 中为用户提供命名空间访问权限?

ruby-on-rails - 尽管明确设置了无限 TTL,但 Google Cloud Storage 仍为请求的 Assets 设置了到期日期