Как использовать конвейер данных для экспорта таблицы DynamoDB с предоставлением по требованию - PullRequest
0 голосов
/ 13 февраля 2019

Раньше я использовал шаблон конвейера данных под названием Export DynamoDB table to S3 для экспорта таблицы DynamoDB в файл.Я недавно обновил все свои таблицы DynamoDB, чтобы обеспечить предоставление по требованию, и шаблон больше не работает.Я почти уверен, что это потому, что старый шаблон задает процент пропускной способности DynamoDB для потребления, который не имеет отношения к таблицам по требованию.

Я попытался экспортировать старый шаблон в JSON, удалив ссылку на пропускную способностьпроцентное потребление и создание нового трубопровода.Однако это не удалось.

Кто-нибудь может подсказать, как преобразовать сценарий конвейера старого стиля с предоставлением пропускной способности в новый сценарий таблицы по требованию?

Вот мой оригинальный функционирующий сценарий:

{
  "objects": [
    {
      "name": "DDBSourceTable",
      "id": "DDBSourceTable",
      "type": "DynamoDBDataNode",
      "tableName": "#{myDDBTableName}"
    },
    {
      "name": "EmrClusterForBackup",
      "coreInstanceCount": "1",
      "coreInstanceType": "m3.xlarge",
      "releaseLabel": "emr-5.13.0",
      "masterInstanceType": "m3.xlarge",
      "id": "EmrClusterForBackup",
      "region": "#{myDDBRegion}",
      "type": "EmrCluster"
    },
    {
      "failureAndRerunMode": "CASCADE",
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "scheduleType": "ONDEMAND",
      "name": "Default",
      "id": "Default"
    },
    {
      "output": {
        "ref": "S3BackupLocation"
      },
      "input": {
        "ref": "DDBSourceTable"
      },
      "maximumRetries": "2",
      "name": "TableBackupActivity",
      "step": "s3://dynamodb-emr-#{myDDBRegion}/emr-ddb-storage-handler/2.1.0/emr-ddb-2.1.0.jar,org.apache.hadoop.dynamodb.tools.DynamoDbExport,#{output.directoryPath},#{input.tableName},#{input.readThroughputPercent}",
      "id": "TableBackupActivity",
      "runsOn": {
        "ref": "EmrClusterForBackup"
      },
      "type": "EmrActivity",
      "resizeClusterBeforeRunning": "true"
    },
    {
      "directoryPath": "#{myOutputS3Loc}/#{format(@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')}",
      "name": "S3BackupLocation",
      "id": "S3BackupLocation",
      "type": "S3DataNode"
    }
  ],
  "parameters": [
    {
      "description": "Output S3 folder",
      "id": "myOutputS3Loc",
      "type": "AWS::S3::ObjectKey"
    },
    {
      "description": "Source DynamoDB table name",
      "id": "myDDBTableName",
      "type": "String"
    },
    {
      "default": "0.25",
      "watermark": "Enter value between 0.1-1.0",
      "description": "DynamoDB read throughput ratio",
      "id": "myDDBReadThroughputRatio",
      "type": "Double"
    },
    {
      "default": "us-east-1",
      "watermark": "us-east-1",
      "description": "Region of the DynamoDB table",
      "id": "myDDBRegion",
      "type": "String"
    }
  ],
  "values": {
    "myDDBRegion": "us-east-1",
    "myDDBTableName": "LIVE_Invoices",
    "myDDBReadThroughputRatio": "0.25",
    "myOutputS3Loc": "s3://company-live-extracts/"
  }
}

Вот моя попытка обновления, которая не удалась:

{
  "objects": [
    {
      "name": "DDBSourceTable",
      "id": "DDBSourceTable",
      "type": "DynamoDBDataNode",
      "tableName": "#{myDDBTableName}"
    },
    {
      "name": "EmrClusterForBackup",
      "coreInstanceCount": "1",
      "coreInstanceType": "m3.xlarge",
      "releaseLabel": "emr-5.13.0",
      "masterInstanceType": "m3.xlarge",
      "id": "EmrClusterForBackup",
      "region": "#{myDDBRegion}",
      "type": "EmrCluster"
    },
    {
      "failureAndRerunMode": "CASCADE",
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "scheduleType": "ONDEMAND",
      "name": "Default",
      "id": "Default"
    },
    {
      "output": {
        "ref": "S3BackupLocation"
      },
      "input": {
        "ref": "DDBSourceTable"
      },
      "maximumRetries": "2",
      "name": "TableBackupActivity",
      "step": "s3://dynamodb-emr-#{myDDBRegion}/emr-ddb-storage-handler/2.1.0/emr-ddb-2.1.0.jar,org.apache.hadoop.dynamodb.tools.DynamoDbExport,#{output.directoryPath},#{input.tableName}",
      "id": "TableBackupActivity",
      "runsOn": {
        "ref": "EmrClusterForBackup"
      },
      "type": "EmrActivity",
      "resizeClusterBeforeRunning": "true"
    },
    {
      "directoryPath": "#{myOutputS3Loc}/#{format(@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')}",
      "name": "S3BackupLocation",
      "id": "S3BackupLocation",
      "type": "S3DataNode"
    }
  ],
  "parameters": [
    {
      "description": "Output S3 folder",
      "id": "myOutputS3Loc",
      "type": "AWS::S3::ObjectKey"
    },
    {
      "description": "Source DynamoDB table name",
      "id": "myDDBTableName",
      "type": "String"
    },
    {
      "default": "us-east-1",
      "watermark": "us-east-1",
      "description": "Region of the DynamoDB table",
      "id": "myDDBRegion",
      "type": "String"
    }
  ],
  "values": {
    "myDDBRegion": "us-east-1",
    "myDDBTableName": "LIVE_Invoices",
    "myOutputS3Loc": "s3://company-live-extracts/"
  }
}

А вот ошибка при выполнении конвейера данных:

at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:322) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:198) at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1341) at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1338) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1836) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1338) at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:575) at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:570) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1836) at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:570) at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java

Ответы [ 2 ]

0 голосов
/ 12 августа 2019

Поддержка таблиц по требованию была добавлена ​​в инструмент экспорта DDB ранее в этом году: GitHub commit

Мне удалось установить более новую сборку инструмента на S3 и обновитьНесколько вещей в конвейере, чтобы заставить его работать:

{
  "objects": [
    {
      "output": {
        "ref": "S3BackupLocation"
      },
      "input": {
        "ref": "DDBSourceTable"
      },
      "maximumRetries": "2",
      "name": "TableBackupActivity",
      "step": "s3://<your-tools-bucket>/emr-dynamodb-tools-4.11.0-SNAPSHOT.jar,org.apache.hadoop.dynamodb.tools.DynamoDBExport,#{output.directoryPath},#{input.tableName},#{input.readThroughputPercent}",
      "id": "TableBackupActivity",
      "runsOn": {
        "ref": "EmrClusterForBackup"
      },
      "type": "EmrActivity",
      "resizeClusterBeforeRunning": "true"
    },
    {
      "failureAndRerunMode": "CASCADE",
      "resourceRole": "DataPipelineDefaultResourceRole",
      "role": "DataPipelineDefaultRole",
      "pipelineLogUri": "s3://<your-log-bucket>/",
      "scheduleType": "ONDEMAND",
      "name": "Default",
      "id": "Default"
    },
    {
      "readThroughputPercent": "#{myDDBReadThroughputRatio}",
      "name": "DDBSourceTable",
      "id": "DDBSourceTable",
      "type": "DynamoDBDataNode",
      "tableName": "#{myDDBTableName}"
    },
    {
      "directoryPath": "#{myOutputS3Loc}/#{format(@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')}",
      "name": "S3BackupLocation",
      "id": "S3BackupLocation",
      "type": "S3DataNode"
    },
    {
      "name": "EmrClusterForBackup",
      "coreInstanceCount": "1",
      "coreInstanceType": "m3.xlarge",
      "releaseLabel": "emr-5.26.0",
      "masterInstanceType": "m3.xlarge",
      "id": "EmrClusterForBackup",
      "region": "#{myDDBRegion}",
      "type": "EmrCluster",
      "terminateAfter": "1 Hour"
    }
  ],
  "parameters": [
    {
      "description": "Output S3 folder",
      "id": "myOutputS3Loc",
      "type": "AWS::S3::ObjectKey"
    },
    {
      "description": "Source DynamoDB table name",
      "id": "myDDBTableName",
      "type": "String"
    },
    {
      "default": "0.25",
      "watermark": "Enter value between 0.1-1.0",
      "description": "DynamoDB read throughput ratio",
      "id": "myDDBReadThroughputRatio",
      "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": "<your table name>",
    "myDDBReadThroughputRatio": "0.5",
    "myOutputS3Loc": "s3://<your-output-bucket>/"
  }
}

Ключевые изменения:

  • Обновите releaseLabel EmrClusterForBackup до "emr-5.26.0".Это необходимо для получения v1.11 AWS SDK для Java и v4.11.0 коннектора DynamoDB (см. Матрицу выпуска здесь: Документы AWS )
  • Обновите шаг TableBackupActivity как указано выше.Укажите его для вашей сборки * .jar и обновите имя класса инструмента с DynamoDbExport до DynamoDBExport

Надеемся, что шаблон по умолчанию также обновляется, так что он просто работает изкоробка.

0 голосов
/ 13 февраля 2019

Я открыл заявку в службу поддержки AWS по этому вопросу.Их ответ был довольно всеобъемлющим.Я вставлю его ниже


Спасибо, что обратились к этой проблеме.

К сожалению, задания экспорта / импорта конвейера данных для DynamoDB не поддерживают новый режим DynamoDB по требованию [1].

Таблицы, использующие емкость по требованию, не имеют определенных емкостей для единиц чтения и записи.Data Pipeline полагается на эту определенную пропускную способность при расчете пропускной способности конвейера.

Например, если у вас есть 100 RCU (единиц измерения емкости) и пропускная способность конвейера 0,25 (25%), эффективная пропускная способность конвейера будетбыть 25 единиц чтения в секунду (100 * 0,25).Однако в случае емкости по требованию RCU и WCU (Единицы емкости записи) отображаются как 0. Независимо от значения пропускной способности конвейера, расчетная эффективная пропускная способность равна 0.

Конвейер не будет выполнятьсякогда эффективная пропускная способность меньше 1.

Требуется ли экспортировать таблицы DynamoDB в S3?

Если вы используете эти экспорты таблиц только для целей резервного копирования, я рекомендую использовать DynamoDB On-DemandФункция резервного копирования и восстановления (запутанно похожее имя на емкость по требованию) [2].

Обратите внимание, что резервные копии по требованию не влияют на пропускную способность вашей таблицы и выполняются за считанные секунды.Вы платите только за расходы на хранение S3, связанные с резервными копиями.Однако эти резервные копии таблиц напрямую недоступны для клиентов и могут быть восстановлены только в исходной таблице.Этот метод резервного копирования не подходит, если вы хотите выполнить аналитику данных резервного копирования или импортировать данные в другие системы, учетные записи или таблицы.

Если вам нужно использовать конвейер данных для экспорта данных DynamoDB, тогдаЕдинственный путь вперед - установить для таблицы (ей) режим «Предоставленная емкость».

Вы можете сделать это вручную или включить его в качестве действия в сам конвейер, используя команду CLI AWS [3].

Например (On-Demand также называется режимом оплаты по запросу):

$ aws dynamodb update-table --table-name myTable --billing-mode PROVISIONED --provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100

-

$ aws dynamodb update-table --table-name myTable --billing-mode PAY_PER_REQUEST

Обратите внимание, что после отключения режима емкости по требованию,вам нужно подождать 24 часа, прежде чем вы сможете снова включить его.

=== Ссылки для справок ===

[1] Емкость DynamoDB On-Demand (также см. примечание о неподдерживаемых).услуги / инструменты): https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand

[2] Резервное копирование и восстановление по требованию DynamoDB: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BackupRestore.html

[3] Справочник по CLS AWS для DynamoDB "-table ": https://docs.aws.amazon.com/cli/latest/reference/dynamodb/update-table.html

...