Amazon Elastic MapReduce - masowa wstawka z S3 do DynamoDB jest niesamowicie powolna

Muszę wykonać wstępne przesłanie około 130 milionów pozycji (łącznie ponad 5 GB) do jednej tabeli DynamoDB. Po tym jak się zmierzyłemproblemy Przesyłając je za pomocą interfejsu API z mojej aplikacji, zdecydowałem się wypróbować EMR.

Krótko mówiąc, import tej bardzo średniej (dla EMR) ilości danych zajmuje wieki nawet w najmocniejszym klastrze, zużywając setki godzin przy bardzo niewielkim postępie (około 20 minut na przetestowanie bitu danych 2Mb i nie udało się zakończyć testowym plikiem 700 MB w ciągu 12 godzin).

Skontaktowałem się już z Amazon Premium Support, ale jak dotąd powiedzieli tylko, że „z jakiegoś powodu import DynamoDB jest powolny”.

Próbowałem następujących instrukcji w mojej interaktywnej sesji ula:

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;

Różne flagi nie wydają się mieć żadnego widocznego efektu. Próbowano następujących ustawień zamiast domyślnych:

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;

Te same polecenia uruchamiane dla HDFS zamiast celu DynamoDB zostały zakończone w ciągu kilku sekund.

Wydaje się, że jest to proste zadanie, bardzo prosty przypadek użycia i naprawdę zastanawiam się, co mogę tu robić źle.

questionAnswers(1)

yourAnswerToTheQuestion