【问题标题】:Comparing using Map Reduce(Cloudera Hadoop 0.20.2) two text files of size of almost 3GB使用 Map Reduce(Cloudera Hadoop 0.20.2) 比较两个大小接近 3GB 的文本文件
【发布时间】:2011-04-09 18:19:58
【问题描述】:

我正在尝试在 hadoop map/reduce 中执行以下操作(用 java 编写,linux 内核操作系统)

  1. 文本文件 'rules-1' 和 'rules-2'(总共 3GB 大小)包含一些规则,每条规则以结束符分隔,因此可以使用 readLine() 函数读取文件。

  2. 这些文件 'rules-1' 和 'rules-2' 需要从我集群中每个映射函数的 hdfs 整体导入,即这些文件不能跨不同映射函数拆分。

  3. 映射器的 map 函数的输入是一个名为“record”的文本文件(每行以结束行字符终止),因此从“record”文件中我们得到 (key, value) 对。该文件是可拆分的,可以作为整个 map/reduce 过程中使用的不同 map 函数的输入。

  4. 需要做的是将每个值(即记录文件中的行)与“rules-1”和“rules-2”中的规则进行比较

问题是,如果我只将每行 rules-1 和 rules-2 文件拉出到一个静态数组列表中一次,这样每个映射器就可以共享相同的数组lint 并尝试将数组列表中的元素与每个输入值进行比较从记录文件中,我得到一个内存溢出错误,因为 3GB 不能一次存储在 arraylist 中。

或者,如果我一次只从 rules-1 和 rules-2 文件中导入几行并将它们与每个值进行比较,则 map/reduce 将花费大量时间来完成其工作。

你们能否提供任何其他替代想法,如何在没有内存溢出错误的情况下做到这一点?如果我将这些文件 1 和文件 2 放在支持 hdfs 的数据库或其他东西中会有帮助吗?我实际上已经没有想法了。如果你们中的一些人能给我您的宝贵建议,我将不胜感激。

【问题讨论】:

  • 不清楚您需要做什么。 “比较每个值”是什么意思?这个比较的输出是什么?您是否只是想在 Hadoop 中的两个文件上运行 linux“diff”命令?两个文件的行数是否相同?
  • “比较每个值”是指将输入文件“记录”中的每一行与文件“规则-1”和“规则-2”的每一行进行比较。不,“rules-1”、“rules-2”和“record”文件的行数不同。

标签: memory hadoop mapreduce compare overflow


【解决方案1】:

如果您输入的文件很小 - 您可以将它们加载到静态变量中并使用规则作为输入。
如果不是上述情况,我可以建议以下方法:
a) 为规则 1 和规则 2 提供接近您拥有的节点数量的高复制因子。然后,您可以从 HDFS rule=1 和 rule-2 读取输入中相对高效的每条记录——因为它将从本地数据节点顺序读取。
b)如果您可以考虑一些散列函数,当应用于规则和输入字符串时,将预测它们可以匹配而不会出现假阴性 - 那么您可以为规则、输入记录发出此散列并在化简器中解析所有可能的匹配.这将与使用 MR 完成连接的方式非常相似
c) 我会考虑一些其他优化技术,例如构建搜索树或排序,否则问题看起来计算量很大,并且会持续很长时间......

【讨论】:

  • 你的建议很有趣,我一定会尝试一下,看看我能做什么。非常感谢!
【解决方案2】:

this page 上找到真实世界集群配置 它将涵盖文件大小配置

【讨论】:

    【解决方案3】:

    您可以使用 conf/mapred-site.xml 中的参数“mapred.child.java.opts”来增加映射器的内存。您可能无法在每台服务器上运行尽可能多的映射槽,但在集群中有更多服务器时,您仍然可以并行化您的工作。

    【讨论】:

    • 谢谢,但我已经尝试过了。而且,我有32位机器
    【解决方案4】:

    从 MapReduce 函数读取内容文本文件并从映射器函数读取关键字文本文件(用于读取您的 HDFS)并使用从 MapReduce 读取的 StringTokenizer value.toString 进行拆分,并在您的映射器函数中写入 HDFS 读取文本文件代码将逐行读取,因此在此处使用两个 while 循环进行比较。每当您想要数据时将其发送到减速器。

    【讨论】:

      【解决方案5】:

      将 3gb 文本文件拆分为多个文本文件,然后像往常一样应用所有文本文件 MapReduce 您之前的程序。

      为了分割文本文件,我编写了 Java 程序,您决定要在每个文本文件中写入多少行。

      【讨论】:

        猜你喜欢
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多