【问题标题】:Is it possible to run / serialize Dataflow job without having all dependencies locally?是否可以在本地没有所有依赖项的情况下运行/序列化 Dataflow 作业?
【发布时间】:2019-09-28 00:35:34
【问题描述】:

我已经使用 Apache Beam 为 Google Cloud Dataflow 创建了一个管道,但我无法在本地拥有 Python 依赖项。但是,远程安装这些依赖项没有问题。

是否可以在我的本地(开发)环境中运行作业或创建模板而不执行 Python 代码?

【问题讨论】:

    标签: python google-cloud-dataflow apache-beam


    【解决方案1】:

    看看这个tutorial。基本上,你编写 python 管道,然后通过命令行部署它

    python your_pipeline.py \
    --project $YOUR_GCP_PROJECT \
    --runner DataflowRunner \
    --temp_location $WORK_DIR/beam-temp \
    --setup_file ./setup.py \
    --work-dir $WORK_DIR
    

    关键部分是 --runner DataflowRunner,因此它使用 Google Dataflow(而不是您的本地安装)来运行管道。显然,您必须设置您的 Google 帐户和凭据。

    【讨论】:

    • 感谢您的回复!是的,当然,我知道,我已经设置了一切,但不知何故,即使使用 DataflowRunner,我的应用程序在部署到 GCS 之前仍在本地执行。
    • 您是否尝试过将代码移动到 Google Storage 上,然后使用 Google Cloud Shell 执行上述命令?您必须将文件路径更改为gs://your-bucket/whatever.py 在这种情况下,我认为它根本不会使用您的本地环境。
    【解决方案2】:

    好吧,我不能 100% 确定这是可能的,但你可以:

    • 定义一个requirements.txt 文件,其中包含管道执行的所有依赖项
    • 避免在管道构建时导入和使用依赖项,仅在执行时代码中。

    因此,例如,您的文件可能如下所示:

    import apache_beam as beam
    
    with beam.Pipeline(...) as p:
      result = (p | ReadSomeData(...)
                | beam.ParDo(MyForbiddenDependencyDoFn()))
    

    在同一个文件中,您的 DoFn 将从管道执行时代码中导入您的依赖项,例如 process 方法。见:

    class MyForbiddenDependencyDoFn(beam.DoFn):
    
      def process(self, element):
        import forbidden_dependency as fd
        yield fd.totally_cool_operation(element)
    

    当你执行你的管道时,你可以这样做:

    python your_pipeline.py \
        --project $GCP_PROJECT \
        --runner DataflowRunner \
        --temp_location $GCS_LOCATION/temp \
        --requirements_file=requirements.txt
    

    我从未尝试过,但它可能会起作用:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      相关资源
      最近更新 更多