ValueProvider<String> 未被 BigTable 的 InstanceID 和 TableID 的管道接受

ValueProvider<String> is not getting accepted by the pipeline for BigTable's InstanceID and TableID

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

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()));

定义 ValueProvider 的接口是:

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);
}

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

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

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

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

  1. 更新您的自定义管道,使用 Bigtable template examples 之一作为示例。请务必使用 BigtableIO 而不是 CloudBigtableIO
  2. 更新 CloudBigtableIO 以一直使用 ValueProviders,直到使用参数。参见 creating_templates, and an example of proper ValueProvider usage in BigtableIO。将其贡献给 apache beam 的 github,或 extend/modify 本地的 class。
  3. 查看现有的 Bigtable 模板管道是否满足您的需求。你可以 launch them from the Dataflow UI.

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