2016-02-24 2 views
1

Я закладываю таблицу DynamoDB с использованием функции импорта, доступной для таблицы. В моей таблице есть GSI. Я устанавливаю единицы емкости записи в 8K для GSI и таблицы.DynamoDB низкая потребляемая емкость записи с GSI

Но когда я запускаю конвейер данных, чтобы засыпать данные из s3. Мое количество потребляемой мощности достигает максимум 4k для таблицы GSI AND. Но когда я пробовал то же самое без GSI, моя потребительская емкость достигает ~ 8K.

Datapipeline configuration.

{ 
    "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?

ответ

0

Одной из основных причин может быть ваше распределение ваших хэш-ключей в GSI. Возможно, ваш основной стол имеет только 1 раздел (это почему вы видите его запись в 8k), а у вас GSI есть 2 раздела (8/2 = 4k).

Каковы ваши значения индекса GSI? возможно, вам стоит подумать о том, чтобы что-то изменить в вашем хэш-ключевом формате, чтобы получить хорошее распространение. (или когда ваша таблица снова расширит ваш индекс индекса GSI).

+0

Я думаю, что максимальная пропускная способность для раздела для динамо составляет 3k. И он разбивает таблицу, если требуется большая пропускная способность, чем это, или когда размер увеличивается более чем на 10 ГБ. Но я получаю максимальную пропускную способность 4k для таблицы и gsi. Но когда я засыпал без gsi, я получаю 8k за стол. И hashkeys как социальные идентификаторы, которые они однородно распределены. Для GSI я использую lastUpdated date. – user2980749

+0

1) никто не знает максимальную пропускную способность на раздел. (за исключением амазонок), и они не хотят говорить. Я думаю, что его 1k из некоторых экспериментов я сделал. 2) lastUpdated date не является хорошим распределением, если ваши записи упорядочены этим. подумайте, что ваши первые 1M-записи находятся на той же последней дате обновления. в этом случае dynamodb имеет очень плохое распространение, и он будет разделять разделы при обновлении db. в этом случае вам необходимо удалить записи перед обновлением db. –

+0

Я ошибался в том, чтобы переразделить его 1K на раздел для записи и 3k для чтения. http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html Я перетасовываю записи перед засыпкой. – user2980749