正在测试Beam PipelineOptions ValueProvider的默认值



我想要一个具有某个PipelineOptions参数默认值的Dataflow模板。

受在线示例的启发,我在我的PipelineOptions"中使用ValueProvider占位符进行延迟参数设置;sub"-接口:

  @Default.String("MyDefaultValue")
  ValueProvider<String> getMyValue();
  void setMyValue(ValueProvider<String> value);

如果我在运行时指定参数,那么该模板可用于启动真正的GCP数据流作业。然而,如果我尝试在做这件事之前不包括参数:

@Rule
public TestPipeline pipeline = TestPipeline.create();
...
  
@Test
public void test() {
  PipelineOptions options = PipelineOptionsFactory.fromArgs(new String[] {...}).withValidation();
  ...
  pipeline.run(options);
}

然后,当我的TestPipeline执行需要参数的DoFn processElement方法时,我得到

IllegalStateException: Value only available at runtime, but accessed from a non-runtime context: 
RuntimeValueProvider{propertyName=myValue, default=MyDefaultValue}
...

更具体地说,它在org.apache.beam.sdk.options.ValueProvider:中失败

@Override
public T get() {
  PipelineOptions options = optionsMap.get(optionsId);
  if (options == null) {
    throw new IllegalStateException(...

人们可能会认为运行时是管道运行的时候。

不管怎样,有人知道我将如何对默认参数进行单元测试吗?假设顶部的代码片段是应该如何设置的,并且它是受支持的?非常感谢。

我在从Eclipse生成数据流模板时遇到了同样的问题,我的数据流模板从Cloud Composer DAG接收了一个参数。

我从谷歌云文档中得到了解决方案:https://cloud.google.com/dataflow/docs/guides/templates/creating-templates#using-函数中的valueprovider

您还可以使用Flex Tempaltes来避免ValueProviders带来的所有麻烦。

相关内容

  • 没有找到相关文章

最新更新