根据Google's Dataflow documentation,Dataflow作业模板的创建是#34;目前仅限于Java和Maven。"但是,至少可以说,GCP数据流网站上的Java文档很麻烦。数据流的1.x和2.x版本在细节方面相当远,我有一些特定的代码要求将我锁定到2.0.0r3代码库,所以我非常需要使用Apache Beam。可以理解的是,Apache非常专注于Maven,但从制度上来说,我的公司大部分时间都把它放在了Gradle之后,以至于去年他们将所有的Java项目迁移到了它,并且已经推迟了 - 介绍它。
然而,现在我们似乎陷入了僵局,因为我们已经有了一个特定的目标,试图将我们的大量后端收集集中在GCP的数据流中,并且GCP Dataflow没有&#39 ;似乎对Gradle有正式的支持。如果是,则不在官方文档中。
是否有足够的技术基础来实际使用Gradle构建Dataflow模板,问题是Google的文档尚未更新以支持此功能?是否有技术上的原因让Gradle无法完成Maven的工作?与Google和Apache的网站上的文档相比,使用GCP Dataflow有更好的指南吗?我之前没有和Maven原型合作过,而且我为#gra; gradle archetypes"做了所有的搜索。最多只能在一年多前找到结果。大多数信息指向2014年和1.7rc3版本的论坛讨论,但我们在3.5上。这感觉它应该是一个已经解决的问题,但对于我的生活,我无法在网上找到任何关于此的信息。
答案 0 :(得分:4)
绝对没有什么能阻止您使用Java编写Dataflow应用程序/管道,并使用Gradle构建它。
Gradle只会生成一个应用程序分发(例如./gradlew clean distTar
),然后您可以使用--runner=TemplatingDataflowPipelineRunner --dataflowJobFile=gs://...
参数提取并运行它。
它只是一个可运行的Java应用程序。
然后,模板和所有二进制文件将上传到GCS,您可以通过控制台,CLI甚至云功能执行管道。
您甚至不需要使用Gradle。您可以在本地运行它,并上传模板/二进制文件。但是,我想你正在使用像Jenkins这样的构建服务器。
也许数据流文档应该读取“注意:模板创建目前仅限于Java”,因为此功能尚未在Python SDK中提供。
答案 1 :(得分:4)
使用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
命令行说明
渐变清洁执行使用 execute 任务,该任务使我们能够轻松地将命令行标志传递给数据流管道。 clean 任务将删除缓存的版本。
-DmainClass = 指定Java Main类,因为我们在单个文件夹中有多个管道。没有这个,Gradle不知道Main类是什么以及在哪里传递args。注意:您的 gradle.build 文件必须在下面包含 task execute 。
-Dexec.args = 指定执行参数,这些参数将传递给管道。注意:您的 gradle.build 文件必须在下面包含 task execute 。
-runner = DataflowRunner 和 -Pdataflow-runner 确保使用的是Google Cloud Dataflow运行器,而不是本地的 DirectRunner
-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 Dataflow管道程序中。例如,我们可以指定主类是什么(因为在同一文件夹中有多个管道),并且可以传递特定的Dataflow参数(即特定的PipelineOptions
)。 more here
build.gradle 的一行显示为runtime group: 'org.apache.beam', name: 'beam-runners-google-cloud-dataflow-java', version:'2.5.0'
非常重要。它提供了Cloud Dataflow运行器,可让您在Google Cloud Platform中执行管道。
答案 2 :(得分:0)
更新: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
环境变量。
添加了最小的依赖项。