amazon-web-services - 使用 EMR 和 Hive 将 DynamoDB 备份到 S3 时只有一个映射器
问题描述
我有一个生产环境中的 DynamoDB 表,其中包含大约 15 亿个对象。我正在编写一个 EMR 脚本来将表备份到 S3。我希望它尽快完成。我有一个脚本,它提供一个具有 4 个 m4.2xlarge 节点的 EMR 集群并运行以下配置单元查询:
SET dynamodb.throughput.read.percent = 1.5;
SET dynamodb.throughput.write.percent = 1.5;
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK;
SET mapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec;
CREATE DATABASE IF NOT EXISTS my_db;
USE my_db;
CREATE EXTERNAL TABLE IF NOT EXISTS ddb_table (composite_key string) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "my_ddb_table", "dynamodb.column.mapping" = "composite_key:composite_key");
INSERT OVERWRITE DIRECTORY 's3://s3-backups/ddb/' SELECT composite_key FROM ddb_table;
当我使用按需 RCU 运行脚本时,作业会产生 62 个任务。当我使用预置的 RCU 运行脚本时,我只得到一个任务(每分钟消耗大约 800 个 RCU)。预置 RCU 的数量(我用 40,000 个 RCU 进行了测试)和自动缩放似乎都不会改变任务的数量。只有按需 RCU 似乎会创建额外的任务。
除了 AWS 希望我支付更多的钱之外,这种行为是否有原因或解决方法?提供更多容量并减少对该提供容量的利用似乎违反直觉。
现在我从按需 RCU 开始我的工作,然后在工作开始后切换到预配置……但这不是很有趣。
有任何想法吗?
解决方案
新的 EMR 版本似乎需要您手动指定的 dynamodb.throughput.write/read 参数(旧版本不是这种情况)。例如
SET dynamodb.throughput.write=40000 // depending on your RCU
SET dynamodb.throughput.write.percent=0.9
SET dynamodb.throughput.read=40000 // depending on your WCU
SET dynamodb.throughput.read.percent=0.9
推荐阅读
- firebase - 如果用户 ID 在文档中,则允许用户读取子集合
- php - 如何使用 PHP 在字符串中搜索日文字符?
- authentication - 如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?
- python-3.x - 深度卷积自动编码器问题——编码维度太大
- json - 尝试在 TypeScript 中解析“JSON”:但这是 JSON 吗?
- jenkins - 未找到此类字段:运行我的 jenkinsfile 时出现字段 java.lang.String sinput 错误
- php - 我无法在可变产品上显示自定义帖子。知道如何解决吗?
- javascript - 某些代码 JavaScript 无法通过调用 AJAX
- powershell - 我的 do/while 循环代码不起作用,我无法弄清楚问题出在哪里
- python - 如何避免网站在一段时间后检测并阻止网络抓取?