Gradle 支持 GCP 数据流模板吗?

Gradle Support for GCP Dataflow Templates?

根据 Google's Dataflow documentation,Dataflow 作业模板创建是 "currently limited to Java and Maven." 然而,GCP 的 Dataflow 站点上 Java 的文档是......至少可以说是混乱的。 Dataflow 的 1.x 和 2.x 版本在细节方面相差甚远,我有一些特定的代码要求将我锁定在 2.0.0r3 代码库中,所以我非常需要使用 Apache光束。 Apache —— 可以理解 —— 非常专注于 Maven,但从制度上讲,我的公司在 Gradle 背后投入了大量精力,以至于他们去年将所有 Java 项目都迁移到了它上面,并且反对重新引入它。

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

是否有足够的技术基础来实际使用 Gradle 构建 Dataflow 模板,问题是 Google 的文档尚未更新以支持此功能?是否存在 Gradle 无法执行 Maven 正在执行的操作的技术原因?有没有比 Google 和 Apache 网站上的文档更好的使用 GCP 数据流的指南?我以前没有使用过 Maven 原型,我为 "gradle archetypes" 所做的所有搜索最多只能找到一年多以前的结果。大多数信息指向 2014 年和版本 1.7rc3 的论坛讨论,但我们使用的是 3.5。这感觉应该是一个已解决的问题,但对于我的生活,我无法在网上找到任何当前信息。

绝对没有什么能阻止您在 Java 中编写数据流 application/pipeline,并使用 Gradle 构建它。

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

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

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

您甚至不需要使用 Gradle。您可以只 运行 在本地,template/binaries 将被上传。但是,我想你正在使用像 Jenkins 这样的构建服务器。

也许 Dataflow 文档应该阅读 "注意:模板创建目前仅限于 Java",因为此功能在 Python SDK 中尚不可用。

运行 云数据流作业的命令行 Gradle

通用执行

$ 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 任务,它允许我们轻松地将命令行标志传递给数据流管道。 clean 任务删除缓存的构建。

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

  3. -Dexec.args= 指定执行参数,这些参数将被传递到管道。注意:您的 gradle.build 文件必须包含 task execute 如下所示。

  4. --runner=Dataflow运行ner-Pdataflow-runner 确保 Google 使用了 Cloud Dataflow runner 而不是本地 Direct运行ner

  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 数据流管道程序。例如,我们可以指定主要的 class 是什么(因为我们在同一文件夹中有多个管道)并且我们可以传递特定的数据流参数(即特定的 PipelineOptions)。 more here

  2. build.gradle那一行runtime group: 'org.apache.beam', name: 'beam-runners-google-cloud-dataflow-java', version:'2.5.0'很重要。它提供了 Cloud Dataflow runner,允许您在 Google Cloud Platform 中执行管道。

更新: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'