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。所以我认为你有几个选择
- 更新您的自定义管道,使用 Bigtable template examples 之一作为示例。请务必使用 BigtableIO 而不是 CloudBigtableIO
- 更新 CloudBigtableIO 以一直使用 ValueProviders,直到使用参数。参见 creating_templates, and an example of proper ValueProvider usage in BigtableIO。将其贡献给 apache beam 的 github,或 extend/modify 本地的 class。
- 查看现有的 Bigtable 模板管道是否满足您的需求。你可以 launch them from the Dataflow UI.
我希望这对你有用。如果我解释得很好,请告诉我。或者如果我忽略了什么。
我正在尝试通过通用数据流代码写入 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。所以我认为你有几个选择
- 更新您的自定义管道,使用 Bigtable template examples 之一作为示例。请务必使用 BigtableIO 而不是 CloudBigtableIO
- 更新 CloudBigtableIO 以一直使用 ValueProviders,直到使用参数。参见 creating_templates, and an example of proper ValueProvider usage in BigtableIO。将其贡献给 apache beam 的 github,或 extend/modify 本地的 class。
- 查看现有的 Bigtable 模板管道是否满足您的需求。你可以 launch them from the Dataflow UI.
我希望这对你有用。如果我解释得很好,请告诉我。或者如果我忽略了什么。