首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Map Reduce(Cloudera Hadoop 0.20.2)的比较两个大小几乎为3GB的文本文件

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

Stack Overflow用户
提问于 2011-04-09 18:19:58
回答 5查看 1.7K关注 0票数 0

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

  1. 文本文件' rules -1‘和'rules-2’(总大小为3GB )包含一些规则,每个规则都由尾行字符分隔,因此可以使用readLine()函数读取文件。
  2. 这些文件'rules-1‘和'rules-2’需要在集群中的每个映射函数中作为一个整体从hdfs中导入,也就是说,这些文件不能在不同的映射函数之间分开。
  3. 映射程序的映射函数的输入是一个名为“record”的文本文件(每行都以尾行字符结尾),因此从“record”文件中我们得到了(key,value)对。该文件是可拆分的,可以作为对整个映射/约简过程中使用的不同映射函数的输入。
  4. 需要做的是比较每个值(即记录文件中的行)和“规则-1”和“规则-2”中的规则。

问题是,如果我将每一行规则-1和规则-2文件提取到静态数组列表中一次,那么每个映射程序都可以共享相同的arraylint,并尝试将数组列表中的元素与记录文件中的每个输入值进行比较,我会得到一个内存溢出错误,因为3GB不能一次存储在数组列表中。

或者,如果我一次只从规则1和规则2导入几行文件,并将它们与每个值进行比较,则map/ from要花费大量时间才能完成它的工作。

你们能给我提供任何其他替代的想法吗?如何避免内存溢出错误?如果我把那些文件-1和文件-2放在hdfs支持数据库或其他什么地方,会有帮助吗?actually.Would真的很感激你们中的一些人能给我你的宝贵建议。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-10 06:09:22

如果您输入的文件很小,您可以将它们加载到静态变量中,并使用规则作为输入。

如果上述情况不是这样的话,我可以建议以下方法:

( a)使规则1和规则2的复制因子接近所拥有的节点数。然后,您可以从HDFS、rule=1和规则2中读取输入中的每条记录,这是相对有效的,因为它是从本地datanode连续读取的。

( b)如果您可以考虑一些哈希函数,当它应用于规则和输入字符串时,就可以在没有假负数的情况下预测它们可以匹配--那么您就可以为规则发出这个散列,并在还原器中记录和解析所有可能的匹配。它将非常类似于如何使用MR完成连接。

( c)我会考虑其他一些优化技术,比如构建搜索树,或者排序,因为否则问题看起来计算成本很高,而且将花费很长时间.

票数 1
EN

Stack Overflow用户

发布于 2011-07-26 06:51:28

此页查找真实集群配置()上,它将涵盖文件大小配置。

票数 1
EN

Stack Overflow用户

发布于 2011-04-10 03:11:11

您可以使用conf/mapred-site.xml中的param "mapred.child.java.opts“来增加映射器的内存。您可能无法在每个服务器上运行那么多的映射插槽,但是在集群中有更多的服务器时,您仍然可以并行处理作业。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5606927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档