【问题标题】:How to bulk load data into a dgraph/standalone:graphql container?如何将数据批量加载到 dgraph/standalone:graphql 容器中?
【发布时间】:2019-11-12 20:58:02
【问题描述】:

假设我有一个类似https://graphql.dgraph.io/docs/quick-start/ 快速入门的数据库

type Product {
    productID: ID!
    name: String @search(by: [term])
    reviews: [Review] @hasInverse(field: about)
}

type Customer {
    custID: ID!
    name: String @search(by: [hash, regexp])
    reviews: [Review] @hasInverse(field: by)
}

type Review {
    id: ID!
    about: Product! @hasInverse(field: reviews)
    by: Customer! @hasInverse(field: reviews)
    comment: String @search(by: [fulltext])
    rating: Int @search
}

现在我想导入数百万个条目,因此想使用批量加载程序。我的数据集是一个包含 .json 文件的 bug 文件夹。

据我所见,我应该能够运行类似的命令 dgraph bulk -f folderOfJsonFiles -s goldendata.schema --map_shards=4 --reduce_shards=2 --http localhost:8000 --zero=localhost:5080

但是要运行我的服务器,我使用的是dgraph/standalone:graphql 图像运行docker run -v $(pwd):/dgraph -p 9000:9000 -it dgraph/standalone:graphql

现在如何开始批量导入?

1: 我应该在 docker 容器本身中运行命令(并共享包含我所有 .json 文件的卷(文件夹))还是在我的主机上安装 dgraph 并从主机运行 dgraph bulk 命令?

2:.json文件的格式应该是什么?

3:批量加载器是否支持空白节点(id 不是_:0x1234)?

[编辑]

  • bulk loader 似乎不支持 graphql 架构,应该先将架构转换为 rdf。为此,我在导入 graphql 架构curl 'localhost:8080/admin/export?format=json' 后立即导出了架构和数据

【问题讨论】:

    标签: graphql bulk-load bulkloader dgraph


    【解决方案1】:

    这里有几点需要理解:

    • 批量加载程序不是实时加载程序的离线版本。它是一个工具,目的是为 Dgraph Alpha(s) 服务器准备数据。
    • 批量加载器,似乎只能加载triples
    • 批量加载程序可以加载架构和文件,但这不是 graphql 架构,graphql 架构必须稍后分开加载。

    所以回答这个问题:

    • 使用 docker run -v $(pwd)/dgraph:/dgraph -p 8000:8000 -p 9000:9000 -p 8080:8080 -p 9080:9080 -p 5080:5080 -it dgraph/standalone:graphql 启动 dgraph graphql 服务器以供参考,此图像启动 /tmp/run.sh 脚本,该脚本本身将运行 dgraph-ratel & dgraph zero & dgraph alpha --lru_mb $lru_mb & dgraph graphql(其中 lru_mb 是您提供给 dgraph alpha 的内存)。保留容器的 id,以备日后丢失时使用 docker ps 查找。

    • 除非您有 + 5 百万个条目(或没有时间),否则请尝试使用实时加载程序。如果您在使用实时加载程序时遇到问题,例如:在几十万个条目(在我的情况下为 300k)之后它变得非常慢,这很可能是因为您的 alpha 没有足够的内存。在我的例子中,我不得不调整 docker 来为引擎提供 16Gb 的内存,脚本为 $lru_mb 变量提供了三分之一的主机内存。

    • 使用实时加载器导入完整数据集后,您可以使用docker exec -it yourDockerContainerId curl localhost:8080/admin/export?format=json 导出数据,导出将生成2个文件,例如:g01.json.gzg01.schema.gz,它们对应于您的条目和他们的架构(不是 graphql 架构)。

    • 要将这两个文件 g01.json.gzg01.schema.gz 导入回您的 dgraph graphql 实例,您需要将它们转换为组的“p”目录输出。据我了解,“p”目录包含 Dgraph Alpha 的所有数据。如果删除它,则会丢失数据,如果将其替换为另一组,则将使用刚刚复制的数据替换/恢复数据。 Bulk loader 不是 dgraph 的一个实例,它只是生成那些“p”目录输出的工具。我已经成功地在容器中运行它。只需运行docker exec -it yourDockerContainerId dgraph bulk -f export/pathTo/g01.json.gz -s export/pathTo/g01.schema.gz --map_shards=1 --reduce_shards=1 --http localhost:8001 --zero=localhost:5080。老实说,我不明白这个命令中http localhost:8001 参数的目的。如果批量加载程序成功运行,它会创建一个 out/0/p 文件夹,其中包含您可以在 Dgraph Alpha 中使用的数据。停止您的 docker 容器 docker stop yourDockerContainerId 然后将您当前的 Dgraph Alpha 的 p 文件夹替换为由批量加载程序生成的文件夹。 (重新)启动您的 docker 容器,您应该拥有导入的数据。 (也许也把 w 和 zw 文件夹扔了,我不知道它们的用途)。

    • 数据已导入,但您将收到一条警告,提示您没有 graphql 架构。好的,让我们导入我们的架构(假设您在路径 dgraph/schemas/schema.graphql 上拥有它)schema=$(cat dgraph/schemas/schema.graphql | tr '\\n' ' ');jq -n --arg schema \"$schema\" '{ query: \"mutation addSchema($sch: String!) { addSchema(input: { schema: $sch }) { schema { schema } } }\", variables: { sch: $schema }}' | curl -X POST -H \"Content-Type: application/json\" http://localhost:9000/admin -d @- 这可能需要几分钟,因为图形可能必须根据您的 graphql 架构的索引规则(通常与 @search 装饰器相关)索引您的数据

    你已经完成了……

    现在,我还没有完全回答这个问题,因为我们要导入的数据是我们刚刚导出的数据(也是我们使用实时加载程序实际导入的数据)。所以不幸的是,bulk loader 不能像 live loader 那样导入好的数据,你必须用三元组喂他。因此您必须准备要加载的数据,使用该格式的批量加载器。为了在这次演讲中为您提供帮助,我建议

    • 运行 dgraph graphql 服务器docker run -v $(pwd)/dgraph:/dgraph -p 8000:8000 -p 9000:9000 -p 8080:8080 -p 9080:9080 -p 5080:5080 -it dgraph/standalone:graphql

    • 导入一个graphql架构(假设架构在路径dgraph/schemas/schema.graphqlschema=$(cat dgraph/schemas/schema.graphql | tr '\\n' ' ');jq -n --arg schema \"$schema\" '{ query: \"mutation addSchema($sch: String!) { addSchema(input: { schema: $sch }) { schema { schema } } }\", variables: { sch: $schema }}' | curl -X POST -H \"Content-Type: application/json\" http://localhost:9000/admin -d @-

    • 使用 graphql 客户端创建一个或两个基本/模板条目。您可以安装Altair chrome extension,连接到http://localhost:9000/graphql,然后添加一些数据,例如:

    mutation {
      addCustomer(input:{name:"Toto"}){
        name
      }
    }
    

    您也可以使用file and the live loader

    • 然后导出你的小模板数据docker exec -it yourDockerContainerId curl localhost:8080/admin/export?format=json

    • 打开g01.json.gz,您会发现bulk loader 期望提供的数据示例。

    空白 id 呢?我不确定,但由于批量加载程序正在对 id 进行 2 级映射,我可以想象你可以提供你的 id,这些将在以后转换为 dgraph id。

    【讨论】:

    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多