在使用Beam的时候,当你升级到2.41.0版本时,你可能会遇到以下异常:
java.lang.IllegalStateException: Value only available at runtime
这个异常是由于Beam升级后引入了一个新的Rule来检查运行时数据是否与Pipeline代码中的数据匹配,导致运行时值无法在编译期间获得,从而导致这个异常。
要解决这个问题,你可以使用以下两种方法之一:
方法一:禁用检查规则
你可以通过在运行Pipeline的时候添加以下标志来禁用检查规则:
-Dorg.apache.beam.sdk.pipeline.PipelineRunnerRegistrar$DefaultRunner--enforceImmutability=false
这将使Beam不再执行检查,从而允许你在编译期间获得值。
方法二:使用InstantiationTimeValueProvider
你可以使用InstantiationTimeValueProvider来处理在编译期间无法获取的值。示例如下:
import org.apache.beam.sdk.options.ValueProvider; import org.apache.beam.sdk.options.ValueProvider.NestedValueProvider; import org.apache.beam.sdk.options.ValueProvider.StaticValueProvider; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.ParDo; import org.apache.beam.sdk.values.KV;
public class MyDoFn extends DoFn
public MyDoFn(ValueProvider
@ProcessElement public void processElement(ProcessContext c) { String value = myValue.get(); String key = c.element().getKey(); String output = key + ":" + value; c.output(output); } }
public class MyPipeline {
public static void main(String[] args) {
String myRuntimeValue = "myRuntimeValue";
MyDoFn myDoFn = new MyDoFn(NestedValueProvider.of(
StaticValueProvider.of(myRuntimeValue), (SerializableFunction
Pipeline p = Pipeline.create(); p.apply