我有一个巨大的 DynamoDB 表,我想对其进行分析以聚合存储在其属性中的数据。然后,Java 应用程序应处理聚合的数据。虽然我了解MapReduce背后的真正基本概念,但我以前从未使用过它。
就我而言,假设我在每个 DynamoDB 项目中都有一个customerId
和orderNumbers
属性,并且我可以为同一客户提供多个项目。喜欢:
customerId: 1, orderNumbers: 2
customerId: 1, orderNumbers: 6
customerId: 2, orderNumbers: -1
基本上,我想对每个 customerId 的 orderNumbers 求和,然后在 Java 中用聚合执行一些操作。
AWS Elastic MapReduce 可能会帮助我,但我不明白如何将自定义 JAR 与 DynamoDB 连接起来。我的自定义 JAR 可能需要同时公开 map
和reduce
函数,在哪里可以找到正确的接口来实现?
另外,我对文档有点困惑,似乎在运行自定义JAR之前,我应该先将数据导出到S3。这是对的吗?
谢谢
注意:我还没有构建有效的 EMR,只是阅读它。
首先,将 Amazon EMR 与 Amazon DynamoDB 集成的先决条件
您可以直接在 DynamoDB 上工作:用于在 Amazon DynamoDB 中导出、导入和查询数据的 Hive 命令示例,如您所见,您可以通过这种方式执行"类似 SQL"的查询。
如果你对Hadoop的知识为零,你可能应该阅读一些介绍材料,比如:什么是Hadoop
。本教程是另一个很好的阅读将 Amazon Elastic MapReduce 与 DynamoDB 结合使用
关于您的自定义 JAR 应用程序,您需要将其上传到 S3。使用本指南:如何使用自定义 JAR 创建作业流
我希望这能帮助您入门。
另请参阅:http://aws.amazon.com/code/Elastic-MapReduce/28549 - 它也使用 Hive 访问 DynamoDB。这似乎是从Hadoop访问DynamoDB的官方AWS方式。
如果您需要在自定义 JAR 中编写自定义代码,我发现:DynamoDB InputFormat for Hadoop
但是,我找不到有关要为此输入格式设置的与 Hive 参数对应的 Java 参数的文档。根据这篇文章,它不是由亚马逊发布的:http://www.newvem.com/amazon-dynamodb-part-iii-mapreducin-logs/
另请参阅:包含org.apache.hadoop.hive.dynamodb的jar
因此,使用来自自定义 MapReduce 作业的 DynamoDB 数据的官方记录方法是将数据 DynamoDB 导出到 S3,然后让 Elastic MapReduce 从 S3 获取数据。我猜这是因为 DynamoDB 被设计为作为键/值"NoSQL"存储随机访问,而 Hadoop 输入和输出格式用于具有大块大小的顺序访问。亚马逊未记录的代码可能是弥补这一差距的一些技巧。
由于导出/重新导入会占用资源,因此最好可以从 Hive 中完成任务。