【问题标题】:Writing to cloud storage as a side effect in cloud dataflow写入云存储作为云数据流中的副作用
【发布时间】:2015-08-22 06:47:44
【问题描述】:

我有一个云数据流作业,它为 appengine 应用程序执行大量处理。在管道的一个阶段,我按特定键进行分组,对于与该键匹配的每条记录,我想将文件写入 Cloud Storage(使用该键作为文件名的一部分)。

我事先不知道这些记录会有多少。所以这种使用模式不符合标准的云数据流数据接收器模式(输出阶段的分片决定了#个输出文件,我无法控制每个分片的输出文件名)。

我正在考虑直接写入云存储作为 ParDo 函数的副作用,但有以下疑问:

  1. 是否允许将写入云存储作为副作用?
  2. 如果我是从数据流管道外部编写的,似乎我应该将 Java 客户端用于 JSON 云存储 API。但这涉及通过 OAUTH 进行身份验证以执行任何工作:对于已经在 GCE 机器上作为数据流管道的一部分运行的工作,这似乎不合适:这可行吗?

感谢您的任何建议。

【问题讨论】:

    标签: google-cloud-storage google-cloud-dataflow


    【解决方案1】:

    回答你问题的第一部分:

    虽然没有什么可以直接阻止您在我们的管道代码中执行副作用(例如写入 Cloud Storage),但通常这是一个非常糟糕的主意。您应该考虑您的代码不是在单台机器上以单线程方式运行的事实。你需要处理几个问题:

    1. 多个写入器可以同时写入。你需要找到一种方法来避免作家之间的冲突。由于 Cloud Storage 不支持直接附加到对象,您可能需要使用 Composite objects 技术。
    2. 工人可以被中止,例如如果基础设施出现暂时性故障或问题,这意味着您需要能够处理中断/不完整的写入问题。
    3. 可以重新启动工作器(在它们被中止之后)。这将导致副作用代码再次运行。因此,您需要能够以一种或另一种方式处理输出中的重复条目。

    【讨论】:

    • 非常感谢您的澄清:事实上,工人故障或备用工人几乎肯定会导致您提到的问题。那么你有什么替代建议可以在这个例子中为每条记录写一个文件吗?
    • 我不是这方面的专家,但也许侧面输出可以工作?
    • 所以做一些进一步的研究,似乎制作一个自定义接收器可以让您获得所有需要的控制,为每个文件写入一条记录。
    • @AlexWilson 能否请您回答您自己的问题,以便其他人可以看到您的问题的解决方案?
    • @AlexWilson 你能提供编写自定义接收器的代码吗?
    【解决方案2】:

    Dataflow 中的任何内容都不会阻止您在 ParDo 中写入 GCS 文件。

    您可以使用GcpOptions.getCredential() 获取用于身份验证的凭据。这将使用合适的机制来获取凭据,具体取决于作业的运行方式。例如,当作业在 Dataflow 服务上执行时,它将使用服务帐户。

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2017-09-26
      • 2013-06-26
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多