【问题标题】:Avro to BigTable - Schema issue?Avro 到 BigTable - 架构问题?
【发布时间】:2021-04-01 07:49:09
【问题描述】:

我正在尝试使用 Dataflow 模板 [1] 将 Avro 文件(使用 Spark 3.0 生成)提取到 BigTable 中,并出现以下错误。

注意该文件可以在 Spark 和 Python avro 库中读取而没有明显问题。

有什么想法吗?

感谢您的支持!

错误(短)

Caused by: org.apache.avro.AvroTypeException: Found topLevelRecord, expecting com.google.cloud.teleport.bigtable.BigtableRow, missing required field key

Avro 架构(摘录)

{"type":"record","name":"topLevelRecord","fields":[{"name":"a_a","type": ["string", "null"]}, ...]}

错误(完整)

java.io.IOException: Failed to start reading from source: gs://myfolder/myfile.avro range [0, 15197631)
at org.apache.beam.runners.dataflow.worker.WorkerCustomSources$BoundedReaderIterator.start (WorkerCustomSources.java:610)
at org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation$SynchronizedReaderIterator.start (ReadOperation.java:361)
at org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation.runReadLoop (ReadOperation.java:194)
at org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation.start (ReadOperation.java:159)
at org.apache.beam.runners.dataflow.worker.util.common.worker.MapTaskExecutor.execute (MapTaskExecutor.java:77)
at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.executeWork (BatchDataflowWorker.java:417)
at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.doWork (BatchDataflowWorker.java:386)
at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.getAndPerformWork (BatchDataflowWorker.java:311)
at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.doWork (DataflowBatchWorkerHarness.java:140)
at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call (DataflowBatchWorkerHarness.java:120)
at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call (DataflowBatchWorkerHarness.java:107)
at java.util.concurrent.FutureTask.run (FutureTask.java:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628)
at java.lang.Thread.run (Thread.java:834)
Caused by: org.apache.avro.AvroTypeException: Found topLevelRecord, expecting com.google.cloud.teleport.bigtable.BigtableRow, missing required field key
at org.apache.avro.io.ResolvingDecoder.doAction (ResolvingDecoder.java:292)
at org.apache.avro.io.parsing.Parser.advance (Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readFieldOrder (ResolvingDecoder.java:130)
at org.apache.avro.generic.GenericDatumReader.readRecord (GenericDatumReader.java:215)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion (GenericDatumReader.java:175)
at org.apache.avro.generic.GenericDatumReader.read (GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.read (GenericDatumReader.java:145)
at org.apache.beam.sdk.io.AvroSource$AvroBlock.readNextRecord (AvroSource.java:644)
at org.apache.beam.sdk.io.BlockBasedSource$BlockBasedReader.readNextRecord (BlockBasedSource.java:210)
at org.apache.beam.sdk.io.FileBasedSource$FileBasedReader.advanceImpl (FileBasedSource.java:484)
at org.apache.beam.sdk.io.FileBasedSource$FileBasedReader.startImpl (FileBasedSource.java:479)
at org.apache.beam.sdk.io.OffsetBasedSource$OffsetBasedReader.start (OffsetBasedSource.java:249)
at org.apache.beam.runners.dataflow.worker.WorkerCustomSources$BoundedReaderIterator.start (WorkerCustomSources.java:607)

参考资料:

[1]https://cloud.google.com/dataflow/docs/guides/templates/provided-batch#avrofiletocloudbigtable

【问题讨论】:

    标签: google-cloud-platform apache-beam gcloud avro google-cloud-bigtable


    【解决方案1】:

    BigTable 是一个可扩展的 NoSQL 数据库服务,这意味着它是无模式的;而 Spark SQL 具有您在问题中指出的架构。

    从下面的错误中,它把你引向 BigTable row key

    expecting com.google.cloud.teleport.bigtable.BigtableRow, missing required field key
    

    因此,您需要按照process 创建您的 BigTable 架构设计。

    由于 HBase 也是无模式的,如果您可以灵活地使用 Spark 2.4.0

    ,则可以使用 Bigtable and the HBase API 解决您的用例

    至于上述用例,它看起来是一个有效的功能请求,我会将其提交给产品团队并用报告编号更新您。

    【讨论】:

    • 谢谢@Ismail。因此,您建议要么预先定义一个映射 Avro 架构的 BigTable 架构,要么使用提到的连接器从 Spark 直接写入 BigTable ?
    • @py-r 我将从连接器开始
    • 谢谢。尝试我的机会,但面对new issues
    猜你喜欢
    • 2018-12-04
    • 2020-12-10
    • 2021-10-10
    • 2018-04-16
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2022-11-04
    • 2021-02-06
    相关资源
    最近更新 更多