java - hadoop/emr如何存储键值对

标签 java hadoop amazon-web-services distributed-caching emr

我正在 EMR 上运行一系列 MapReduce 作业。但是,第3个MapReduce作业需要第2个MapReduce作业输出的数据,输出的基本上是百万以上的键值对(key和value都是小于 1KB)。有没有一种好的方法可以将这些信息存储在与 EMR 相同的机器上的分布式存储中,以便后续作业可以访问这些信息?我看了DistributedCache ,但它更多的是用于存储文件?我不确定 Hadoop 是否针对存储一百万个小文件进行了优化..

或者我可以通过某种方式使用另一个 MapReduce 作业将所有键值对组合成一个输出文件,然后将整个文件放入 DistributedCache

请指教。谢谢!

最佳答案

通常,map reduce 作业的输出存储在 HDFS(或 S3)中。该作业的 reducer 数量决定了输出文件的数量。你怎么会有一百万个小文件?你运行一百万个 reducer 吗?我不太确定。

因此,如果您为第二个作业定义一个单一的 reducer ,您将自动以一个单一的输出文件结束,该文件将存储在 HDFS 中。您的第 3 个作业将能够访问和处理此文件作为输入。如果第二个作业需要多个 reducer,您将有多个输出文件。 100 万个键和值各为 1 KB 的键值对给您一个小于 2 GB 的文件。对于 64 MB 的 HDFS block 大小,您最终会得到大小为 N*64 MB 的结果文件,这将允许第 3 个作业并行处理 block (多个映射器)。

仅当整个文件需要在每个 单个映射器中读取时,才应使用DistributedCache。然而,最大尺寸。 2 GB 这是一个相当有缺陷的方法。

关于java - hadoop/emr如何存储键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379698/

相关文章:

hadoop - 远程运行 Hadoop 作业

amazon-web-services - 云形成 : Block deleting resources

python - 在 Apache Hadoop 上扩展 python mrjob 程序

java - BlockingQueues 和线程访问顺序

java - 对其他贡献者隐藏部分代码

java - TypeAdapterFactory 的 Lambda 表达式

hadoop - Pig生成 key 更改列-比较先前记录与当前记录,但列不同

amazon-web-services - AWS Cognito 在 authEvents 中发送无效的 DeviceName

apache - 页面加载时将 https 设置为默认值

java - Java 真的是按值传递对象吗?