java - 价值提供者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);
}
如果我在这里遗漏了什么,请告诉我。
解决方案
不幸的是,CloudBigtableIO参数似乎没有更新为通过 ValueProvider 由模板修改。虽然BigtableIO与 ValueProviders 兼容。
为了使 Dataflow 模板能够在从模板启动时修改参数,它使用的库转换(即源和接收器)必须首先更新为用户 ValueProviders,以便将参数一直更新到库代码中,当参数用来。在此处查看有关ValueProvider的更多详细信息。
但是,我们有使用 BigtableIO 而不是 CloudBigtableIO 的示例模板管道。请参阅AvroToBigtable。所以我认为你有几个选择
- 使用Bigtable 模板示例之一作为示例来更新您的自定义管道。请务必使用 BigtableIO 而不是 CloudBigtableIO
- 更新 CloudBigtableIO 以一直使用 ValueProviders,直到使用该参数。请参阅created_templates以及BigtableIO中正确使用 ValueProvider 的示例。将其贡献给 apache beam 的 github,或在本地扩展/修改该类。
- 看看现有的 Bigtable 模板管道是否满足您的需求。您可以从 Dataflow UI 启动它们。
我希望这对你有用。如果我解释得很好,请告诉我。或者如果我忽略了什么。
推荐阅读
- service - 来自服务的持续更新 UI
- android - Android 应用程序(在模拟器中)不通过 http 连接到本地 rest API
- c# - 在 TempData 中显示数据
- ios - 瘦身胖视图控制器 - 条码扫描仪不再工作
- c++builder - C++Builder 10.3 开箱即用完全功能失调 - GUI 窗口不更新。这只是我吗?
- java - 从用户输入的两个数组,并得到两个数组的公共值的输出
- javascript - 从函数的返回得到不同的答案
- javascript - 为什么我的 history.pushState 调用会导致 null 状态?
- c# - 将除法表示为整数之和
- angular - 错误 TS2769:没有重载匹配此调用