【问题标题】:Gradle Support for GCP Dataflow Templates?Gradle 是否支持 GCP 数据流模板?
【发布时间】:2017-04-28 02:07:55
【问题描述】:

根据Google's Dataflow documentation,Dataflow 作业模板创建“目前仅限于 Java 和 Maven”。但是,GCP 的 Dataflow 站点上的 Java 文档是……至少可以说是混乱的。 Dataflow 的 1.x 和 2.x 版本在细节方面相差甚远,我有一些特定的代码要求将我锁定在 2.0.0r3 代码库中,因此我非常需要使用 Apache Beam。 Apache - 可以理解 - 非常专注于 Maven,但从制度上讲,我的公司将大部分精力放在了 Gradle 上,以至于他们去年将所有 Java 项目都迁移到了它,并反对重新引入它。

但是,现在我们似乎陷入了僵局,因为我们有一个特定的目标,即尝试将我们的大量后端收集集中在 GCP 的 Dataflow 中,而 GCP Dataflow 似乎没有正式支持摇篮。如果是这样,它不在官方文档中。

是否有足够的技术基础来实际使用 Gradle 构建 Dataflow 模板,而问题是 Google 的文档根本没有更新以支持这一点? Gradle 不能做 Maven 所做的事情是否有技术原因?是否有比 Google 和 Apache 网站上的文档更好的 GCP Dataflow 使用指南?我以前没有使用过 Maven 原型,而且我对“gradle archetypes”所做的所有搜索都是一年多前的结果。大多数信息都指向 2014 年和 1.7rc3 版本的论坛讨论,但我们使用的是 3.5。感觉这应该是一个已解决的问题,但对于我的生活,我无法在网上找到任何有关此的最新信息。

【问题讨论】:

    标签: maven gradle google-cloud-dataflow archetypes


    【解决方案1】:

    使用 Gradle 运行 Cloud Dataflow 作业的命令行

    通用执行

    $ gradle clean execute -DmainClass=com.foo.bar.myfolder.MyPipeline -Dexec.args="--runner=DataflowRunner --gcpTempLocation=gs://my-bucket/tmpdataflow" -Pdataflow-runner
    

    具体例子

    $ gradle clean execute -DmainClass=com.foo.bar.myfolder.MySpannerPipeline -Dexec.args="--runner=DataflowRunner --gcpTempLocation=gs://my-bucket/tmpdataflow --spannerInstanceId=fooInstance --spannerDatabaseId=barDatabase" -Pdataflow-runner
    

    命令行解释

    1. gradle clean execute 使用 execute 任务,它允许我们轻松地将命令行标志传递给 Dataflow Pipeline。 clean 任务删除缓存的构建。

    2. -DmainClass= 指定 Java Main 类,因为我们在一个文件夹中有多个管道。没有这个,Gradle 不知道 Main 类是什么以及在哪里传递参数。注意:您的 gradle.build 文件必须包含以下 task execute

    3. -Dexec.args= 指定将传递给管道的执行参数。注意:您的 gradle.build 文件必须包含以下 task execute

    4. --runner=DataflowRunner-Pdataflow-runner 确保使用的是 Google Cloud Dataflow 运行器,而不是本地 DirectRunner

    5. --spannerInstanceId=--spannerDatabaseId= 只是特定于管道的标志。您的管道不会有它们。

    build.gradle 内容(注意:您需要填充特定的依赖项)

    apply plugin: 'java'
    apply plugin: 'maven'
    apply plugin: 'application'
    
    group = 'com.foo.bar'
    version = '0.3'
    
    mainClassName = System.getProperty("mainClass")
    
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    repositories {
    
         maven { url "https://repository.apache.org/content/repositories/snapshots/" }
         maven { url "http://repo.maven.apache.org/maven2" }
    }
    
    dependencies {
        compile group: 'org.apache.beam', name: 'beam-sdks-java-core', version:'2.5.0'
        // Insert your build deps for your Beam Dataflow project here
        runtime group: 'org.apache.beam', name: 'beam-runners-direct-java', version:'2.5.0'
        runtime group: 'org.apache.beam', name: 'beam-runners-google-cloud-dataflow-java', version:'2.5.0'
    }
    
    task execute (type:JavaExec) {
        main = System.getProperty("mainClass")
        classpath = sourceSets.main.runtimeClasspath
        systemProperties System.getProperties()
        args System.getProperty("exec.args").split()
    }
    

    build.gradle的解释

    1. 我们使用 task execute (type:JavaExec) 以便轻松地将运行时标志传递到 Java Dataflow 管道程序中。例如,我们可以指定主类是什么(因为我们在同一个文件夹中有多个管道)并且我们可以传递特定的 Dataflow 参数(即特定的PipelineOptions)。 more here

    2. build.gradle 中读取runtime group: 'org.apache.beam', name: 'beam-runners-google-cloud-dataflow-java', version:'2.5.0' 的行非常重要。它提供了允许您在 Google Cloud Platform 中执行管道的 Cloud Dataflow 运行器。

    【讨论】:

    • 哇,感谢您的详细回答!这正是我想要的
    • 此外,我发现this Colab 会引导您完成使用 gradle 构建的 apache 梁示例。挺好的。
    【解决方案2】:

    绝对没有什么能阻止您用 Java 编写 Dataflow 应用程序/管道,并使用 Gradle 来构建它。

    Gradle 将简单地生成一个应用程序分发(例如./gradlew clean distTar),然后您可以使用--runner=TemplatingDataflowPipelineRunner --dataflowJobFile=gs://... 参数提取并运行它。

    它只是一个可运行的 Java 应用程序。

    然后将模板和所有二进制文件上传到 GCS,您可以通过控制台、CLI 甚至 Cloud Functions 执行管道。

    您甚至不需要使用 Gradle。您可以在本地运行它,然后将上传模板/二进制文件。但是,我想你正在使用像 Jenkins 这样的构建服务器。

    也许数据流文档应该是注意:模板创建目前仅限于 Java”,因为 Python SDK 中尚不提供此功能。

    【讨论】:

    • 哇!谢谢!你是对的;计划是将它与我​​们的其他管道集成到 Distelli 中,但这个管道让我望而却步。我明天先试试这个。
    • 太棒了。如果对您有帮助,请考虑支持并接受我的回答。
    • 嘎。对不起。我尝试对评论进行投票,但我的代表太低而无法显示。我坐下来,进行了一半的验证,然后陷入无休止的会议,忘记了回到这里结束循环。谢谢你的平。答案有效。
    • 这个答案似乎不是最新的(例如 TemplatingDataflowPipelineRunner 似乎不存在。)你愿意更新它吗?
    【解决方案3】:

    更新:2020 年 12 月 7 日

    我们也可以使用gradle暂存数据流模板。

    舞台:

    这里是强制参数:

    • project
    • region
    • gcpTempLocation(如果您没有存储桶创建访问权限,则很好,如果没有,它将自动创建)
    • stagingLocation
    • templateLocation

    这是gradle中的示例命令行:

    gradle clean execute -D mainClass=com.something.mainclassname -D exec.args="--runner=DataflowRunner --project=<project_id> --region=<region_name> --gcpTempLocation=gs://bucket/somefolder --stagingLocation=gs://bucket/somefolder --templateLocation=gs://bucket/somefolder"
    

    假设:

    • GOOGLE_APPLICATION_CREDENTIALS 环境变量使用服务帐户密钥设置。

    • gradle 已安装。

    • JAVA_HOME 环境变量已设置。

    • 添加了最低限度的依赖项。

      • 编译'org.apache.beam:beam-sdks-java-core:2.22.0'
      • 编译'org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.22.0'
      • 编译 'org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.22.0'
      • 编译 'org.apache.beam:beam-runners-google-cloud-dataflow-java:2.22.0'

    【讨论】:

      猜你喜欢
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2015-10-09
      • 2016-09-15
      相关资源
      最近更新 更多