比较使用Map Reduce(Cloudera Hadoop 0.20.2)两个大小近3GB的文本文件

时间:2011-04-09 18:19:59

标签: memory hadoop mapreduce compare overflow

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

  1. 文本文件'rules-1'和'rules-2'(总大小为3GB)包含一些规则,每个规则由endline字符分隔,因此可以使用readLine()函数读取文件。 / p>

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

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

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

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

    或者,如果我一次仅从rules-1和rules-2文件导入几行并将它们与每个值进行比较,则map / reduce需要花费很多时间才能完成其工作。

    如果没有内存溢出错误,你能为我提供任何其他的替代想法吗?如果我将那些file-1和file-2放在hdfs支持数据库或其他东西中会有帮助吗?我实际上已经没想到了。如果你们中的一些人能够提供你宝贵的建议,我真的很感激。

5 个答案:

答案 0 :(得分:1)

如果您输入的文件很小 - 您可以将它们加载到静态变量中并使用规则作为输入。
如果不是上述情况,我可以建议以下方式:
a)使rule-1和rule-2高复制因子接近您拥有的节点数。然后你可以从HDFS规则= 1和规则-2中读取输入中每个记录的相对有效 - 因为它将从本地datanode顺序读取。
b)如果您可以考虑一些哈希函数,当应用于规则和输入字符串时,它们将预测它们可以匹配的错误否定 - 那么您可以为规则,输入记录发出此哈希并解析减速器中的所有可能匹配。它与使用MR的连接方式非常相似 c)我会考虑一些其他的优化技术,比如构建搜索树或排序,否则问题会看起来很昂贵并且会花费很长时间......

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

从MapReduce函数中读取内容文本文件,并从mapper函数中读取关键字文本文件(用于读取HDFS)并使用StringTokenizer value.toString从MapReduce读取并在mapper函数中写入HDFS读取文本文件代码将逐行阅读,所以在这里使用两个while循环进行比较。无论什么时候你想要数据发送到reducer。

答案 4 :(得分:0)

将3gb文本文件拆分为多个文本文件,并照常应用所有文本文件MapReduce以前的程序。

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