AWS DMS - DocumentDB > ElasticSearch - 获取主键字符串时出错

AWS DMS - DocumentDB > ElasticSearch - Error Getting Primary Key String

我正在使用 DMS 定期将所有数据从 DocumentDB 迁移到 elasticSearch 集群。

当我 运行 任务时,一些 table 会正常迁移到 ElasticSearch 而在一些我会出错。

对于每个发出错误的 table,我都会收到两个错误:

[TARGET_LOAD]E: Error Getting Primary Key String for hash key for table 'XXX' https://forums.aws.amazon.com/ (field_mapping_utils.c:644)
[TARGET_LOAD]E: Error extracting Field-type-info from data_record https://forums.aws.amazon.com/ (elasticsearch_utils.c:1088)

我不知道该做什么。这是上面“XXX”table 中的示例文档:

{"_id":"5fe07b894ae10f100cb3d623","orgId":"XXX","firstName":"XXX","middleName":"","lastName":"XXX","email":"XXX","previousUsedEmails":[{email: "XXX", timeOfCreation: 1234}],"phone":null,"passHash":"1234","oldPassHashes": ["1234"],"isEmailVerified":true,"isSuspended":false,"role": ["abc"],"isArchived":false,"lastSignedIn":0,"isNew":false,"recruiterAccount":null,"failedLoginAttempts":0,"lockedUntilTimestamp":null,"owner":"5fe0722ec2238046e8ade172","addedTimestamp":1608547190,"updatedTimestamp":1608547190}

_id 在 DocumentDB 中属于 ObjectId 类型。

如有任何帮助,我们将不胜感激。

编辑:

我选中了 _id as a separate column Extract document ("_id") as a separate column 复选框并添加了以下转换规则:

{
      "rule-type": "transformation",
      "rule-id": "1",
      "rule-name": "1",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%",
        "column-name": "_id"
      },
      "rule-action": "add-prefix",
      "value": "old",
      "old-value": null
    }

这导致错误消失,但弹性搜索文档只有来自 documentDB 数据库的 _id(重命名为 old__id),没有其他字段。

然后我将 documentDB 端点中的“元数据模式”从之前的“文档”更改为“table”,将 1000 作为要扫描的项目以获取字段名称(这绰绰有余) ,然后只有布尔值和整数字段会转入弹性搜索,即没有字符串、数组等字段。

我不确定这些天 AWS 在做什么测试,这里似乎没有任何文档可以说明问题,也没有任何错误。

编辑#2

从该文档中,我看到 documentDb 中的字符串和数组在 AWS DMS 中被视为“CLOB”:https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.DocumentDB.html#CHAP_Source.DocumentDB.DataTypes

并且从该文档中:https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Elasticsearch.html 我看到 Elasticsearch 不支持“LOB”数据类型,这似乎是我面临的问题的症结所在。这很愚蠢,最后我似乎无法迁移像“lastName”和“firstName”这样的字段,它们根本不是大对象。

仍在挖掘,感谢任何帮助。

想通了,但答案可能令人失望。

从该文档中,我看到 documentDb 中的字符串和数组在 AWS DMS 中被视为“CLOB”:https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.DocumentDB.html#CHAP_Source.DocumentDB.DataTypes

并且从该文档中:https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Elasticsearch.html我看到 Elasticsearch 不支持“LOB”数据类型,这似乎是我面临的问题的症结所在。

您可以通过将此转换放入任务来迁移字段:

{
      "rule-type": "transformation",
      "rule-id": "3",
      "rule-name": "3",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%",
        "column-name": "%",
        "data-type": "clob"
      },
      "rule-action": "change-data-type",
      "data-type": {
        "type": "string",
        "length": 50
      }
    }

这适用于字符串字段,但是,由于 documentDb reader 也将数组视为“clob”数据类型,因此数组内容也被字符串化。虽然这可能适用于某些用例,但由于这个问题我已经放弃了 DMS,只是编写了我自己的迁移器(这花费了更少的时间,但我曾希望 DMS 的自动管理功能,哦,好吧。)

回顾一下,您必须在 documentDb 端点配置中使用 table 元数据类型,还需要为 _id 字段添加映射,如下所示:

{
      "rule-type": "transformation",
      "rule-id": "1",
      "rule-name": "1",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%",
        "column-name": "_id"
      },
      "rule-action": "add-prefix",
      "value": "old",
      "old-value": null
    }