首页 > 解决方案 > 价值提供者BigTable 的 InstanceID 和 TableID 的管道未接受

问题描述

我正在尝试通过通用数据流代码写入 BigTable。泛型是指它必须能够使用 ValueProvider 在运行时写入作为参数提供的任何 BigTable 表。代码没有显示任何错误,但是当我尝试创建代码模板时,我可以看到以下错误消息:

Exception in thread "main" java.lang.IllegalStateException: Value only available at runtime, but accessed from a non-runtime context: RuntimeValueProvider{propertyName=bigTableInstanceId, default=null}

这很奇怪,因为它支持提供 ValueProviders 的功能。

下面是我用来写入 BigTable 的代码:

results.get(btSuccessTag).apply("Write to BigTable",
                    CloudBigtableIO.writeToTable(new CloudBigtableTableConfiguration.Builder()
                            .withProjectId(options.getProject())
                            .withInstanceId(options.getBigTableInstanceId())
                            .withTableId(options.getBigTableTable())
                            .build()));

定义 ValueProviders 的接口是:

public interface BTPipelineOptions extends DataflowPipelineOptions{
    @Required
    @Description("BigTable Instance Id")
    ValueProvider<String> getBigTableInstanceId();
    void setBigTableInstanceId(ValueProvider<String> bigTableInstanceId);

    @Required
    @Description("BigTable Table Destination")
    ValueProvider<String> getBigTableTable();
    void setBigTableTable(ValueProvider<String> bigTableTable);

    @Required
    @Description("BT error file path")
    ValueProvider<String> getBTErrorFilePath();
    void setBTErrorFilePath(ValueProvider<String> btErrorFilePath);
}

如果我在这里遗漏了什么,请告诉我。

标签: javagoogle-cloud-platformgoogle-cloud-dataflowapache-beamgoogle-cloud-bigtable

解决方案


不幸的是,CloudBigtableIO参数似乎没有更新为通过 ValueProvider 由模板修改。虽然BigtableIO与 ValueProviders 兼容。

为了使 Dataflow 模板能够在从模板启动时修改参数,它使用的库转换(即源和接收器)必须首先更新为用户 ValueProviders,以便将参数一直更新到库代码中,当参数用来。在此处查看有关ValueProvider的更多详细信息。

但是,我们有使用 BigtableIO 而不是 CloudBigtableIO 的示例模板管道。请参阅AvroToBigtable。所以我认为你有几个选择

  1. 使用Bigtable 模板示例之一作为示例来更新您的自定义管道。请务必使用 BigtableIO 而不是 CloudBigtableIO
  2. 更新 CloudBigtableIO 以一直使用 ValueProviders,直到使用该参数。请参阅created_templates以及BigtableIO中正确使用 ValueProvider 的示例。将其贡献给 apache beam 的 github,或在本地扩展/修改该类。
  3. 看看现有的 Bigtable 模板管道是否满足您的需求。您可以从 Dataflow UI 启动它们

我希望这对你有用。如果我解释得很好,请告诉我。或者如果我忽略了什么。


推荐阅读