【问题标题】:Dataflow writing to Datastore: "Message: datastore transaction or write too big."数据流写入数据存储:“消息:数据存储事务或写入太大。”
【发布时间】:2017-11-15 09:13:18
【问题描述】:

我刚开始使用 Dataflow / Apache Beam。 我用 Python 编写了一个 Dataflow 管道,用于将大量产品(> 50K 产品,存储在 JSON 文件中)导入 Datastore。 管道在我的本地计算机 (DirectRunner) 上运行良好,但在 DataflowRunner 上失败并显示以下错误消息:

RPCError: datastore call commit [while running 'write to datastore/Write Mutation to Datastore'] failed: Error code: INVALID_ARGUMENT. Message: datastore transaction or write too big.

我的猜测是 Datastore 无法处理管道的写入速率,但我不确定如何降低 Dataflow 管道中的写入。

我正在使用 WriteToDatastore 转换来写入 DataStore:

from apache_beam.io.gcp.datastore.v1.datastoreio import WriteToDatastore

我的管道如下所示:

with beam.Pipeline(options=pipeline_options) as p:
(p  # pylint: disable=expression-not-assigned
 | 'read from json' >> ReadFromText(known_args.input, coder=JsonCoder())
 | 'create entity' >> beam.Map(
     EntityWrapper(known_args.namespace, known_args.kind,
                   known_args.ancestor).make_entity)
 | 'write to datastore' >> WriteToDatastore(known_args.dataset))

提前感谢您的帮助。

【问题讨论】:

    标签: python google-cloud-datastore google-cloud-dataflow apache-beam


    【解决方案1】:

    看起来不像是写入速率问题。该错误消息意味着突变超出了系统限制。原因可能包括:

    • 单笔交易超过 500 个实体
    • 单次交易超过 10MiB
    • 单个实体中超过 1MiB
    • 实体的总复合索引大小超过 2MiB

    您可以在我们的Limits documentation 中阅读有关 Cloud Datastore 系统限制的更多信息。

    【讨论】:

    • 感谢丹的建议。奇怪的是,使用 DirectRunner 时它根本不会失败。此外,我的实体很小(1 个键和 2 个属性,都非常小),并且我不使用任何事务功能(我不相信 WriteToDatastore 默认使用任何事务)。索引也一样...是否有一种简单的方法来识别触发 Exception 的实体?否则,我正在考虑在 Java 中实现相同的管道,看看我的问题是否会消失......
    • 嗨,丹。我尝试切换到 Java,但遇到了同样的问题。奇怪的是,有时管道运行成功,有时它会失败并显示此错误消息。我相信这是一个写入速率问题,在写入具有索引的数据存储种类时会发生这种情况。我正在寻找一种方法来控制对 DataStore 的写入速率,但在网上找不到任何东西。有什么线索吗?
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多