Amazon Elastic MapReduce - inserção em massa do S3 para o DynamoDB é incrivelmente lenta

Preciso realizar um upload inicial de aproximadamente 130 milhões de itens (5+ Gb no total) em uma única tabela do DynamoDB. Depois eu enfrenteiproblemas com o upload deles usando a API do meu aplicativo, decidi testar o EMR.

Para encurtar a história, a importação dessa quantidade de dados muito média (para EMR) leva muito tempo até mesmo no cluster mais poderoso, consumindo centenas de horas com muito pouco progresso (cerca de 20 minutos para processar o bit de dados de teste de 2Mb e não gerenciou para terminar com o arquivo de teste 700Mb em 12 horas).

Já entrei em contato com o Amazon Premium Support, mas até agora eles disseram apenas que "por algum motivo, a importação do DynamoDB é lenta".

Eu tentei as seguintes instruções na minha sessão de colmeia interativa:

CREATE EXTERNAL TABLE test_medium (
  hash_key string,
  range_key bigint,
  field_1 string,
  field_2 string,
  field_3 string,
  field_4 bigint,
  field_5 bigint,
  field_6 string,
  field_7 bigint
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LOCATION 's3://my-bucket/s3_import/'
;

CREATE EXTERNAL TABLE ddb_target (
  hash_key string,
  range_key bigint,
  field_1 bigint,
  field_2 bigint,
  field_3 bigint,
  field_4 bigint,
  field_5 bigint,
  field_6 string,
  field_7 bigint
)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES (
  "dynamodb.table.name" = "my_ddb_table",
  "dynamodb.column.mapping" = "hash_key:hash_key,range_key:range_key,field_1:field_1,field_2:field_2,field_3:field_3,field_4:field_4,field_5:field_5,field_6:field_6,field_7:field_7"
)
;  

INSERT OVERWRITE TABLE ddb_target SELECT * FROM test_medium;

Várias bandeiras não parecem ter nenhum efeito visível. Tentei as seguintes configurações em vez das configurações padrão:

SET dynamodb.throughput.write.percent = 1.0;
SET dynamodb.throughput.read.percent = 1.0;
SET dynamodb.endpoint=dynamodb.eu-west-1.amazonaws.com;
SET hive.base.inputformat=org.apache.hadoop.hive.ql.io.HiveInputFormat;
SET mapred.map.tasks = 100;
SET mapred.reduce.tasks=20;
SET hive.exec.reducers.max = 100;
SET hive.exec.reducers.min = 50;

Os mesmos comandos executados para o HDFS, em vez do destino do DynamoDB, foram concluídos em segundos.

Essa parece ser uma tarefa simples, um caso de uso muito básico, e eu realmente me pergunto o que posso estar fazendo de errado aqui.

questionAnswers(1)

yourAnswerToTheQuestion