我正在 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/