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
命令行解释
gradle clean execute 使用 execute 任务,它允许我们轻松地将命令行标志传递给数据流管道。 clean 任务删除缓存的构建。
-DmainClass= 指定 Java Main class 因为我们在一个文件夹中有多个管道。没有这个,Gradle 不知道 Main class 是什么以及将参数传递到哪里。注意:您的 gradle.build 文件必须包含 task execute 如下所示。
-Dexec.args= 指定执行参数,这些参数将被传递到管道。注意:您的 gradle.build 文件必须包含 task execute 如下所示。
--runner=Dataflow运行ner 和 -Pdataflow-runner 确保 Google 使用了 Cloud Dataflow runner 而不是本地 Direct运行ner
--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
的解释
我们使用 task execute (type:JavaExec)
以便轻松地将运行时标志传递到 Java 数据流管道程序。例如,我们可以指定主要的 class 是什么(因为我们在同一文件夹中有多个管道)并且我们可以传递特定的数据流参数(即特定的 PipelineOptions
)。 more here
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'
根据 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
命令行解释
gradle clean execute 使用 execute 任务,它允许我们轻松地将命令行标志传递给数据流管道。 clean 任务删除缓存的构建。
-DmainClass= 指定 Java Main class 因为我们在一个文件夹中有多个管道。没有这个,Gradle 不知道 Main class 是什么以及将参数传递到哪里。注意:您的 gradle.build 文件必须包含 task execute 如下所示。
-Dexec.args= 指定执行参数,这些参数将被传递到管道。注意:您的 gradle.build 文件必须包含 task execute 如下所示。
--runner=Dataflow运行ner 和 -Pdataflow-runner 确保 Google 使用了 Cloud Dataflow runner 而不是本地 Direct运行ner
--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
的解释我们使用
task execute (type:JavaExec)
以便轻松地将运行时标志传递到 Java 数据流管道程序。例如,我们可以指定主要的 class 是什么(因为我们在同一文件夹中有多个管道)并且我们可以传递特定的数据流参数(即特定的PipelineOptions
)。 more herebuild.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'