如何将数据大容量加载到dgraph/standalone:graphql容器中?

如何将数据大容量加载到dgraph/standalone:graphql容器中?,graphql,bulk-load,bulkloader,dgraph,Graphql,Bulk Load,Bulkloader,Dgraph,假设我有一个db,就像 i、 e 现在我想导入数百万个条目,因此希望使用批量加载程序。我的数据集是一个充满.json文件的bug文件夹 据我所见,我应该能够运行如下命令 dgraph bulk-f folderOfJsonFiles-s goldendata.schema--map_shards=4--reduce_shards=2--http localhost:8000--zero=localhost:5080 但是要运行我的服务器,我使用的是dgraph/standalone:graphq

假设我有一个db,就像

i、 e

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

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

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

现在如何开始批量导入

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

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

3:大容量加载程序是否支持空白节点(id不是
)\uU4:0x1234

[编辑]

  • 大容量加载程序似乎不支持graphql模式,该模式应首先转换为rdf。为了实现这一点,我在导入graphql模式之后立即导出了模式和数据
    curl'localhost:8080/admin/export?format=json'

    • 以下是一些需要了解的事情:

      • 批量加载程序不是实时加载程序的脱机版本。该工具用于为Dgraph Alpha(s)服务器准备数据
      • 散装装载机,似乎只能装载
      • 大容量加载程序可以加载架构和文件,但这不是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
        查找丢失的容器

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

      • 一旦您使用live loader导入了完整的数据集,您就可以使用
        docker exec-it yourDockerContainerId curl localhost:8080/admin/export?format=json
        ,导出将生成两个文件,例如:
        g01.json.gz
        g01.schema.gz
        ,它们对应于您的条目及其模式(这不是graphql模式)

      • 要将这两个文件
        g01.json.gz
        g01.schema.gz
        导入回dgraph graphql实例,您需要将它们转换为组的“p”目录输出。据我所知,“p”目录保存Dgraph Alpha的所有数据。如果删除它,您的数据将丢失,如果用另一组数据替换它,您将用刚才复制的数据替换/恢复数据。大容量加载程序不是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停止docker容器ID
        然后用生成的文件夹替换当前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 query:\“addSchema\”($sch:String!){addSchema(输入:{schema:$sch}}}{schema{schema}}}}\”,变量:{sch:$schema}}}'| curl-X POST-H\“内容类型:application/json\”http://localhost:9000/admin -d@-
        这可能需要几分钟的时间,因为graph可能必须根据graphql模式的索引规则对数据进行索引(通常与
        @search
        装饰器相关)

      你完了

      现在,我仍然没有完全回答这个问题,因为我们正在导入的数据是我们刚刚导出的数据(以及我们实际使用live loader导入的数据)。因此,不幸的是,批量加载程序无法像live loader那样导入好的数据,您必须向他提供三元组。因此,您必须以该格式使用批量加载程序准备要加载的数据。为了在本次讲座中帮助您,我建议

      • 运行dgraph-graphql服务器
        docker Run-v$(pwd)/dgraph:/dgraph-p8000:8000-p9000:9000-p8080:8080-p9080:9080-p5080-it dgraph/standalone:graphqltype 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
        }
        
        mutation {
          addCustomer(input:{name:"Toto"}){
            name
          }
        }