使用Apache Beam的数据流sdk写入BigTable时捕获到NullPointerException

时间:2016-09-13 17:39:28

标签: nullpointerexception google-cloud-dataflow google-cloud-bigtable apache-beam apache-beam-io

我正在使用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;
  }

感谢。

1 个答案:

答案 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没有支持他们)。