Мне нужно выполнить первоначальную загрузку примерно 130 миллионов элементов (всего 5+ Гб) в одну таблицу DynamoDB.После того, как я столкнулся с проблемамипри загрузке их с помощью API из моего приложения, я решил вместо этого попробовать EMR.
Короче говоря, импорт этого очень среднего (для EMR) объема данных занимает целую вечность даже на самом мощном кластере, занимая сотни часов с очень небольшим прогрессом (около 20 минут для обработки тестового 2-мегабитного бита данных и не не успеваю закончить с тестовым файлом 700Mb за 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, выполнялись за секунды.
Это кажется простой задачей, очень простым вариантом использования, и мне действительно интересно, что я могу сделать здесь неправильно.