Amazon Elastic MapReduce - массовая вставка из S3 в DynamoDB невероятно медленная

Мне нужно выполнить первоначальную загрузку примерно 130 миллионов элементов (всего 5 Гб) в одну таблицу DynamoDB. После того, как я столкнулся спроблем загрузив их с помощью API из моего приложения, я решил вместо этого попробовать EMR.

ороче говоря, импорт этого очень среднего (для EMR) объема данных занимает годы даже на самом мощном кластере, занимая сотни часов при очень небольшом прогрессе (около 20 минут на обработку тестового бита данных объемом 2 МБ, и не удается завершить тестовый файл размером 700 Мб за 12 часов).

Я уже связывался со службой поддержки Amazon Premium, но пока они говорили, что «по какой-то причине импорт в DynamoDB идет медленно».

Я попробовал следующие инструкции в своем интерактивном сеансе улья:

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;

Различные флаги не имеют видимого эффекта. Пробовали следующие настройки вместо стандартных:

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;

Те же команды, выполняемые для HDFS вместо цели DynamoDB, были выполнены за считанные секунды.

Это, кажется, простая задача, очень простой вариант использования, и мне действительно интересно, что я могу здесь делать неправильно.

Ответы на вопрос(1)

Ваш ответ на вопрос