Apache Beam,BigQueryIO.WriteTableRows() 上的 NoSuchMethodError?

Posted

技术标签:

【中文标题】Apache Beam,BigQueryIO.WriteTableRows() 上的 NoSuchMethodError?【英文标题】:Apache Beam, NoSuchMethodError on BigQueryIO.WriteTableRows()? 【发布时间】:2018-06-12 12:44:19 【问题描述】:

我最近将现有管道从数据流 1.x 升级到数据流 2.x,但我看到了一个对我来说没有意义的错误。我将把相关代码放在下面,然后包含我看到的错误。

// This is essentially the final step in our pipeline, where we write
// one of the side outputs from the pipeline to a BigQuery table

results.get(matchedTag)
  .apply("CountBackfill", Count.<String>perElement())
  .apply("ToReportRow", ParDo.of(new ToReportRow()))
  // at this point, there is now a PCollection<TableRow>
  .apply("WriteReport", BigQueryIO.writeTableRows()
    .to(reportingDataset + ".AttributeBackfill_" + dayStr)
    .withSchema(ReportSchema.get())
    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_TRUNCATE)
    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));


/*
* Create a TableRow from a key/value pair
*/
public static class ToReportRow extends DoFn<KV<String, Long>, TableRow> 

  private static final long serialVersionUID = 1L;

  @ProcessElement
  public void processElement(ProcessContext c) throws InterruptedException 
    KV<String, Long> row = c.element();

    c.output(new TableRow()
      .set(ReportSchema.ID, row.getKey())
      .set(ReportSchema.COUNT, row.getValue()));
  

这是我看到的错误:

线程“主”java.lang.NoSuchMethodError 中的异常: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V 在 org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO$Write.expand(BigQueryIO.java:1426) 在 org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO$Write.expand(BigQueryIO.java:989) 在 org.apache.beam.sdk.Pipeline.applyInternal(Pipeline.java:525) 在 org.apache.beam.sdk.Pipeline.applyTransform(Pipeline.java:479) 在 org.apache.beam.sdk.values.PCollection.apply(PCollection.java:297) 在 com.prod.merge.DailyUniqueProfiles.buildPipeline(DUP.java:106) 在 com.prod.merge.MergePipeline.main(MergePipeline.java:91)

.apply("WriteReport", BigQueryIO.writeTableRows() 行是DUP.java 中的第 106 行,所以我怀疑这行是错误的。

对可能出现的问题有什么想法吗?

【问题讨论】:

问题似乎与番石榴的冲突版本有关,尽管我还不确定冲突是由什么引起的。 我也遇到了同样的错误。你能解决这个问题吗? @Vetri 我刚刚在下面发布了我的解决方案。希望它也适合你。 谢谢@Max - 你的解决方案给了我一个提示,我修复了它。发布我的解决方案。 【参考方案1】:

这个问题的解决方案最终是在 maven 依赖项中。添加以下依赖后,使用mvn重新编译,错误消失了。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>22.0</version>
</dependency>

【讨论】:

【参考方案2】:

看起来旧版本的番石榴正在被传递依赖所吸引。以下对依赖项的更改对我有用。

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-bigquery</artifactId>
    <version>v2-rev295-1.22.0</version>
    <exclusions>
        <!-- Exclude an old version of guava that is being pulled in by a transitive dependency of google-api-client -->
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava-jdk5</artifactId>
       </exclusion>
    </exclusions>
</dependency> 

【讨论】:

以上是关于Apache Beam,BigQueryIO.WriteTableRows() 上的 NoSuchMethodError?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行 Apache Beam 集成测试?

Python 上的 Apache Beam 将 beam.Map 调用相乘

Apache Beam - 跳过管道步骤

什么是 Apache Beam? [关闭]

apache beam ElasticSearchIO 遇到异常后job中断执行 自己定制beam IO

数据流管道上的 Apache Beam StatusRuntimeException