【问题标题】:What if the reducer's input is too big in Hadoop MapReduceHadoop MapReduce中reducer的输入太大怎么办
【发布时间】:2015-08-18 13:16:45
【问题描述】:

我想了解在这种情况下该怎么做。
例如,我有 1TB 的文本数据,假设其中 300GB 这个单词 “你好”。
每次map操作后,我都会有一个的键值对集合。

但正如我所说,这是一个巨大的集合,300GB,据我所知,reducer 得到了所有这些并将粉碎。

解决办法是什么?
让我们假设组合器在这里对我没有帮助(WordCount 示例只是为了简单起见),并且对于 reducer 来说数据仍然太大。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    中间(映射器)输出存储在运行映射器任务的节点的本地文件系统中,然后进行清理。请注意,此映射器输出未存储在 HDFS 中。 reducer 确实获得了任何特定键的所有中间键值对(即键 'Hello' 的所有 300 GB 输出将由同一个 Reducer 任务处理)。仅在需要时才将这些数据带入内存。

    希望这会有所帮助。

    【讨论】:

    • 如果我的磁盘上没有 300GB 空间怎么办?会不会分区?
    • 为了处理这种情况,存在一个属性'mapreduce.cluster.local.dir',可以在mapred-site.xml文件中设置。它可以包含一个以逗号分隔的目录路径列表,这些路径可以指向不同设备上的目录,以分散磁盘 I/O。如果未设置,则其默认值为 ${hadoop.tmp.dir}/mapred/local。注意:属性 hadoop.tmp.dir 在文件 core-site.xml 中设置。大多数 Linux 发行版的默认值是“/tmp”。请参考以下文件:hadoop.apache.org/docs/stable/hadoop-mapreduce-client/…
    【解决方案2】:

    reducer 确实获取了所有这些数据,但这些数据实际上是写入磁盘的,并且仅在您遍历值的 Iteratable 时才被带入内存。事实上,该迭代返回的对象被重复用于每个值:字段和其他状态在对象被交给您之前被简单地替换。这意味着您必须显式复制值对象才能同时在内存中拥有所有值对象。

    【讨论】:

    • 但据我了解,Hadoop 不会将中间值存储在磁盘上。我错了吗?顺便说一句,你能告诉我这里的 Spark 有什么不同吗?
    • Map 任务将其输出写入本地磁盘,而不是 HDFS。
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多