Amazon Elastic MapReduce - Masseneinfügung von S3 nach DynamoDB ist unglaublich langsam

Ich muss einen ersten Upload von ungefähr 130 Millionen Elementen (insgesamt 5+ GB) in eine einzelne DynamoDB-Tabelle durchführen. Nachdem ich konfrontiert warProbleme Nachdem ich sie mithilfe der API aus meiner Anwendung hochgeladen hatte, entschied ich mich, stattdessen EMR zu versuchen.

Um es kurz zu machen, der Import dieser sehr durchschnittlichen (für EMR) Datenmenge dauert selbst auf dem leistungsstärksten Cluster eine Ewigkeit. Dabei werden Hunderte von Stunden mit sehr geringem Fortschritt verbraucht (etwa 20 Minuten für die Verarbeitung des 2-MB-Datenbits) und es gelang nicht in 12 Stunden mit dem Test 700Mb Datei zu beenden).

Ich habe bereits den Amazon Premium-Support kontaktiert, aber bisher wurde nur gesagt, dass der DynamoDB-Import aus irgendeinem Grund langsam ist.

Ich habe die folgenden Anweisungen in meiner interaktiven Hive-Sitzung ausprobiert:

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;

Verschiedene Flaggen scheinen keine sichtbare Wirkung zu haben. Ich habe die folgenden Einstellungen anstelle der Standardeinstellungen versucht:

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;

Dieselben Befehle, die für HDFS anstelle des DynamoDB-Ziels ausgeführt wurden, wurden in Sekunden ausgeführt.

Das scheint eine einfache Aufgabe zu sein, ein sehr grundlegender Anwendungsfall, und ich frage mich wirklich, was ich hier falsch machen kann.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage