属性[tempLocation]的预期getter将在所有上标记为@default

时间:2018-03-19 11:38:11

标签: google-cloud-dataflow apache-beam

我正在尝试执行写入BigQuery的Dataflow管道。我知道为了做到这一点,我需要指定一个GCS临时位置。

所以我定义了选项:

private interface Options extends PipelineOptions {
    @Description("GCS temp location to store temp files.")
    @Default.String(GCS_TEMP_LOCATION)
    @Validation.Required
    String getTempLocation();
    void setTempLocation(String value); 

    @Description("BigQuery table to write to, specified as "
                + "<project_id>:<dataset_id>.<table_id>. The dataset must already exist.")
    @Default.String(BIGQUERY_OUTPUT_TABLE)
    @Validation.Required
    String getOutput();
    void setOutput(String value);
}

并尝试将其传递给Pipeline.Create()函数:

public static void main(String[] args) {
    Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class));
    ...
}

但是我收到以下错误。我不明白为什么,因为我注释with@Default

Exception in thread "main" java.lang.IllegalArgumentException: Expected getter for property [tempLocation] to be marked with @Default on all [my.gcp.dataflow.StarterPipeline$Options, org.apache.beam.sdk.options.PipelineOptions], found only on [my.gcp.dataflow.StarterPipeline$Options]

1 个答案:

答案 0 :(得分:1)

以上代码段是您的代码还是SDK中的副本?

您没有为此定义新的选项类。你真的想在BigQueryIO.Write [1]上调用withCustomGcsTempLocation。

另外,我认为BQ应该自己决定一个临时位置,如果你不提供它。你试过没试过吗?你收到错误了吗?

[1] https://github.com/apache/beam/blob/a17478c2ee11b1d7a8eba58da5ce385d73c6dbbc/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.java#L1402

大多数用户只需设置登台目录。要设置暂存目录,您需要执行以下操作:

DataflowPipelineOptions options = PipelineOptionsFactory.create()
    .as(DataflowPipelineOptions.class);
options.setRunner(BlockingDataflowPipelineRunner.class);
options.setStagingLocation("gs://SET-YOUR-BUCKET-NAME-HERE");

但是如果你想设置gcpTemporaryDirectory,你也可以这样做:

GcpOptions options = PipelineOptionsFactory.as(GcpOptions.class);
options.setGcpTempLocation()

基本上你必须做.as(X.class)来获得X选项。然后,一旦拥有该对象,您就可以设置属于X的任何选项。您可以在线找到许多其他示例。