【问题标题】:Multithreading in Apache Beam : Reading Files in Seperate ThreadsApache Beam 中的多线程:在单独的线程中读取文件
【发布时间】:2017-11-21 22:55:57
【问题描述】:

我们需要创建单独的线程来读取多个文件。

  1. 线程 1 可以读取文件 1 并创建 PCollection<String>。我可以在多线程环境中执行Pardo Operation。并从PCollection< String > 创建一个PCollection < String,String >
  2. 线程 2 并从线程 1 完成相同的操作,但在不同的文件 File 2 上。
  3. 在线程 1 和线程 2 操作完成后,在主线程中加入 File1 和 File 2 的输出。

能否请您告诉这是否可行,这是一种推荐的方法?

【问题讨论】:

    标签: apache-beam


    【解决方案1】:

    听起来你想要的东西可以用 Beam 完成。在 Beam 模型中,您没有定义如何您希望您的操作运行,而是定义您希望执行的什么操作;然后是 Beam,底层运行器负责管理线程。

    这就是为什么您通常不应该管理自己的线程来读取 Beam 中的文件。您应该使用TextIO 从纯文本文件中读取,TextIO 模块应该并行读取文件。

    在某些情况下,您的文件将无法被并行读取:

    1. 您的文件已压缩。这意味着文件需要同时解压和读取,并且可以同时从不同的偏移量读取。
    2. 您的文件太多(1000 个)。如果您有数千或数万个文件,您可能希望使用 TextIO.readAll 而不是正常的 TextIO 实现,因为跟踪正在并行读取的数千个文件可能会使系统不堪重负。

    如果您使用的是非纯文本文件或其他类型的源,请告诉我。

    【讨论】:

    • 谢谢巴勃罗。我们的用例是读取 10 个 GB 大小的大型输入文件并将它们转换为 PCollection。然后我们使用连接根据主键提取信息,最后我们创建一组输出文件。以下是转型。 1) File1 -> PCollection ---> PCollection>(要使用连接,我们将 PColeciton 转换为主键 KV 结构)。 2)我们可以使用多线程并行读取多个文件吗? 3) 我们是否会从使用多线程并行读取大型输入文件中获得任何性能优势。
    • 我已经更新了答案。如果这能回答您的问题,请告诉我。
    • 1) 我们使用的是 GB 大小的 .txt 文件。 2)请您澄清以下内容。我们的实现如下所示 PCollection FileData1 = TextIO.read().from(File1.txt); PCollection FileData2 = TextIO.read().from(File2.txt); PCollection FileData3 = TextIO.read().from(File3.txt);您能否确认从 File1、File2、File3 读取是并行发生的。
    • 我相信这应该并行读取您的文件。你觉得它没有这样做吗?如果你使用的是dataflow,可以提供一个Job ID,我可以看看。
    • 谢谢巴勃罗。这正是我们试图理解的。
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多