Amazon dynamodb 使用GSI的DynamoDB低消耗写容量

Amazon dynamodb 使用GSI的DynamoDB低消耗写容量,amazon-dynamodb,Amazon Dynamodb,我正在使用可用于表的导入功能回填DynamoDB表。我的桌子有一个GSI。我正在将GSI和table的写入容量单位设置为8K 但当我运行数据管道来回填s3中的数据时。GSI和table的消耗容量单位均达到最大4k。但当我在没有GSI的情况下尝试同样的方法时,我的消费能力达到了~8K 数据管道配置 { "objects": [ { "failureAndRerunMode": "CASCADE", "resourceRole": "DataPipelineDef

我正在使用可用于表的导入功能回填DynamoDB表。我的桌子有一个GSI。我正在将GSI和table的写入容量单位设置为8K

但当我运行数据管道来回填s3中的数据时。GSI和table的消耗容量单位均达到最大4k。但当我在没有GSI的情况下尝试同样的方法时,我的消费能力达到了~8K

数据管道配置

{
  "objects": [
    {
      "failureAndRerunMode": "CASCADE",
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "pipelineLogUri": "s3://logger/logs/",
      "scheduleType": "ONDEMAND",
      "name": "Default",
      "id": "Default"
    },
    {
      "output": {
        "ref": "DDBDestinationTable"
      },
      "input": {
        "ref": "S3InputDataNode"
      },
      "maximumRetries": "2",
      "name": "TableLoadActivity",
      "step": "s3://dynamodb-emr-#{myDDBRegion}/emr-ddb-storage-handler/2.1.0/emr-ddb-2.1.0.jar,org.apache.hadoop.dynamodb.tools.DynamoDbImport,#{input.directoryPath},#{output.tableName},#{output.writeThroughputPercent}",
      "runsOn": {
        "ref": "EmrClusterForLoad"
      },
      "id": "TableLoadActivity",
      "type": "EmrActivity",
      "resizeClusterBeforeRunning": "false"
    },
    {
      "writeThroughputPercent": "#{myDDBWriteThroughputRatio}",
      "name": "DDBDestinationTable",
      "id": "DDBDestinationTable",
      "type": "DynamoDBDataNode",
      "tableName": "#{myDDBTableName}"
    },
    {
      "taskInstanceType": "m3.xlarge",
      "bootstrapAction": "s3://#{myDDBRegion}.elasticmapreduce/bootstrap-actions/configure-hadoop, --mapred-key-value,mapreduce.map.speculative=false",
      "taskInstanceCount": "5",
      "name": "EmrClusterForLoad",
      "coreInstanceCount": "1",
      "coreInstanceType": "m3.xlarge",
      "amiVersion": "3.8.0",
      "id": "EmrClusterForLoad",
      "masterInstanceType": "m3.xlarge",
      "region": "#{myDDBRegion}",
      "type": "EmrCluster"
    },
    {
      "directoryPath": "#{myInputS3Loc}",
      "name": "S3InputDataNode",
      "id": "S3InputDataNode",
      "type": "S3DataNode"
    }
  ],
  "parameters": [
    {
      "description": "Input S3 folder",
      "id": "myInputS3Loc",
      "type": "AWS::S3::ObjectKey"
    },
    {
      "description": "Target DynamoDB table name",
      "id": "myDDBTableName",
      "type": "String"
    },
    {
      "default": "0.25",
      "watermark": "Enter value between 0.1-1.0",
      "description": "DynamoDB write throughput ratio",
      "id": "myDDBWriteThroughputRatio",
      "type": "Double"
    },
    {
      "default": "us-east-1",
      "watermark": "us-east-1",
      "description": "Region of the DynamoDB table",
      "id": "myDDBRegion",
      "type": "String"
    }
  ],
  "values": {
    "myDDBRegion": "us-west-2",
    "myDDBTableName": "KNEX_NODE",
    "myDDBWriteThroughputRatio": "1",
    "myInputS3Loc": "s3://DataToLoad/sampleData/"
  }
}

对于使用GSI进行写操作,您有什么建议可以实现最大的写吞吐量?

其中一个主要原因可能是您在GSI中分配了哈希键。 可能您的主表只有一个分区(这就是为什么您看到它是用8k编写的),而您的GSI有两个分区(8/2=4k)


您的GSI索引值是多少?也许你应该考虑改变你的哈希键格式的东西,以便得到良好的分布。(或者当您的表将再次增长GSI索引拆分时)。

一个主要原因可能是您在GSI中分配了哈希键。 可能您的主表只有一个分区(这就是为什么您看到它是用8k编写的),而您的GSI有两个分区(8/2=4k)


您的GSI索引值是多少?也许你应该考虑改变你的哈希键格式的东西,以便得到良好的分布。(或者当您的表将再次增加GSI索引拆分时)。

我认为dynamo的每个分区的最大吞吐量是3k。如果我们需要更多的吞吐量,或者当大小增长超过10GB时,它会对表进行分区。但对于table和gsi,我只能获得4k的最大吞吐量。但当我在没有gsi的情况下反冲时,我得到了8k的积分。哈希键作为社会ID,它们是统一分布的。对于GSI,我使用的是lastUpdated。1)没有人知道每个分区的最大吞吐量。(除了亚马逊的工程师们)他们不想说。我想这是我做的一些实验得出的1k。2) 如果您的记录是由此供应商订购的,则LastUpdate不是一个好的分发版本。想想看,您的第一个1M记录与上次更新日期相同。在这种情况下,dynamodb的分布非常糟糕,它将在更新数据库时分割分区。在这种情况下,您应该在更新数据库之前对记录进行排序。我错误地将每个分区的1K重新划分为写分区,3k重新划分为读分区。我正在回填之前洗牌记录。嗨,你测试过洗牌记录吗?吞吐量有变化吗?我尝试了差不多相同的方法,在一个有GSI的12M记录表和buth的10K wps吞吐量上,我在表和GSI中都得到了4.5K wps。有趣的是,在DataPipeline的吞吐量中,我把0.9表示为0.45,这是0.9/2。可能DataPipeline作业检测到存在table+gsi,并错误地将吞吐量除以2。我认为dynamo的每个分区的最大吞吐量是3k。如果我们需要更多的吞吐量,或者当大小增长超过10GB时,它会对表进行分区。但对于table和gsi,我只能获得4k的最大吞吐量。但当我在没有gsi的情况下反冲时,我得到了8k的积分。哈希键作为社会ID,它们是统一分布的。对于GSI,我使用的是lastUpdated。1)没有人知道每个分区的最大吞吐量。(除了亚马逊的工程师们)他们不想说。我想这是我做的一些实验得出的1k。2) 如果您的记录是由此供应商订购的,则LastUpdate不是一个好的分发版本。想想看,您的第一个1M记录与上次更新日期相同。在这种情况下,dynamodb的分布非常糟糕,它将在更新数据库时分割分区。在这种情况下,您应该在更新数据库之前对记录进行排序。我错误地将每个分区的1K重新划分为写分区,3k重新划分为读分区。我正在回填之前洗牌记录。嗨,你测试过洗牌记录吗?吞吐量有变化吗?我尝试了差不多相同的方法,在一个有GSI的12M记录表和buth的10K wps吞吐量上,我在表和GSI中都得到了4.5K wps。有趣的是,在DataPipeline的吞吐量中,我把0.9表示为0.45,这是0.9/2。可能DataPipeline作业不知何故检测到存在table+gsi,并错误地将吞吐量除以2。