【问题标题】:NullPointerException caught when writing to BigTable using Apache Beam's dataflow sdk使用 Apache Beam 的数据流 sdk 写入 BigTable 时捕获 NullPointerException
【发布时间】:2016-09-13 17:39:28
【问题描述】:

我正在使用Apache's Beam sdk 版本0.2.0-incubating-SNAPSHOT 并尝试使用Dataflow 运行器将数据拉到一个大表中。不幸的是,在执行我使用BigTableIO.Write 作为接收器的数据流管道时,我得到了NullPointerException。根据我的需要,已经检查了我的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)您使用的是什么版本的SDK? 2)你用的是什么跑步者? (direct runner、Spark、Flink、Dataflow?)如果是Dataflow,能否给出job ID?
  • @jkff 感谢您的评论。是的,刚刚编辑了我的问题,包括版本。所以,是的,我正在使用 Dataflow 运行器。它的工作ID是2016-09-13_08_29_14-14276852956124203982
  • 我查看了作业及其类路径,如果我没记错的话,看起来您使用的是 beam-sdks-java-{core,io 的 0.3.0-incubating-SNAPSHOT 版本},但是 google-cloud-dataflow-java 的 0.2.0-incubating-SNAPSHOT 版本。我相信问题是因为这个 - 你必须使用相同的版本(更多细节:版本 0.3.0 中的 BigtableIO 使用 \@Setup 和 \@Teardown 方法,但 runner 0.2.0 还不支持它们)。跨度>
  • @jkff 正是这个问题,刚刚在这里修复。谢谢。
  • @jkff - 请将您的评论移到答案中,以便可以接受并且可以将此问题标记为已关闭。感谢您解决问题!

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


【解决方案1】:

我查看了作业及其类路径,如果我没记错的话,您使用的版本似乎是 0.3.0-incubating-SNAPSHOTbeam-sdks-java-{core,io},但 version 0.2.0-incubating-SNAPSHOTgoogle-cloud-dataflow-java

我相信问题是因为这个 - 你必须使用相同的版本(更多细节:版本 0.3.0 中的 BigtableIO 使用 @Setup@Teardown 方法,但 runner 0.2.0 还不支持它们) .

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多