我正在使用Apache's Beam
sdk版本0.2.0-incubating-SNAPSHOT
并尝试使用Dataflow
跑步者将数据提取到bigtable。不幸的是,我在执行我的数据流管道时遇到NullPointerException
我正在使用BigTableIO.Write
作为我的接收器。根据我的需要,已经检查了我的BigtableOptions
并且参数很好。
基本上,我创建并在我的管道中的某些方面,我已经将PCollection<KV<ByteString, Iterable<Mutation>>>
写入我想要的大表:
final BigtableOptions.Builder optionsBuilder =
new BigtableOptions.Builder().setProjectId(System.getProperty("PROJECT_ID"))
.setInstanceId(System.getProperty("BT_INSTANCE_ID"));
// do intermediary steps and create PCollection<KV<ByteString, Iterable<Mutation>>>
// to write to bigtable
// modifiedHits is a PCollection<KV<ByteString, Iterable<Mutation>>>
modifiedHits.apply("writting to big table", BigtableIO.write()
.withBigtableOptions(optionsBuilder).withTableId(System.getProperty("BT_TABLENAME")));
p.run();
执行管道时,我得到了NullPointerException
,用public void processElement(ProcessContext c)
方法指出了BigtableIO类:
(6e0ccd8407eed08b): java.lang.NullPointerException at org.apache.beam.sdk.io.gcp.bigtable.BigtableIO$Write$BigtableWriterFn.processElement(BigtableIO.java:532)
我检查过这个方法是在处理bigtable之前处理所有元素,但是不确定为什么我会在超时时间内执行此管道。根据下面的代码,此方法使用bigtableWriter
属性来处理每个c.element()
,但我甚至无法设置断点来调试哪里恰好是null
。关于如何解决这个问题的任何建议或建议?
@ProcessElement
public void processElement(ProcessContext c) throws Exception {
checkForFailures();
Futures.addCallback(
bigtableWriter.writeRecord(c.element()), new WriteExceptionCallback(c.element()));
++recordsWritten;
}
感谢。
答案 0 :(得分:2)
我查找了这份工作及其类路径,如果我没弄错,您似乎正在使用0.3.0-incubating-SNAPSHOT
的版本beam-sdks-java-{core,io}
,但是version 0.2.0-incubating-SNAPSHOT
google-cloud-dataflow-java
。
我认为问题是因为这个 - 你必须使用相同的版本(更多细节:版本0.3.0中的BigtableIO使用@Setup
和@Teardown
方法,但是跑步者0.2.0没有支持他们)。