我试图在hadoop /reduce(用java,linux内核操作系统编写)中执行以下操作
问题是,如果我将每一行规则-1和规则-2文件提取到静态数组列表中一次,那么每个映射程序都可以共享相同的arraylint,并尝试将数组列表中的元素与记录文件中的每个输入值进行比较,我会得到一个内存溢出错误,因为3GB不能一次存储在数组列表中。
或者,如果我一次只从规则1和规则2导入几行文件,并将它们与每个值进行比较,则map/ from要花费大量时间才能完成它的工作。
你们能给我提供任何其他替代的想法吗?如何避免内存溢出错误?如果我把那些文件-1和文件-2放在hdfs支持数据库或其他什么地方,会有帮助吗?actually.Would真的很感激你们中的一些人能给我你的宝贵建议。
发布于 2011-04-10 06:09:22
如果您输入的文件很小,您可以将它们加载到静态变量中,并使用规则作为输入。
如果上述情况不是这样的话,我可以建议以下方法:
( a)使规则1和规则2的复制因子接近所拥有的节点数。然后,您可以从HDFS、rule=1和规则2中读取输入中的每条记录,这是相对有效的,因为它是从本地datanode连续读取的。
( b)如果您可以考虑一些哈希函数,当它应用于规则和输入字符串时,就可以在没有假负数的情况下预测它们可以匹配--那么您就可以为规则发出这个散列,并在还原器中记录和解析所有可能的匹配。它将非常类似于如何使用MR完成连接。
( c)我会考虑其他一些优化技术,比如构建搜索树,或者排序,因为否则问题看起来计算成本很高,而且将花费很长时间.
发布于 2011-07-26 06:51:28
在此页查找真实集群配置()上,它将涵盖文件大小配置。
发布于 2011-04-10 03:11:11
您可以使用conf/mapred-site.xml中的param "mapred.child.java.opts“来增加映射器的内存。您可能无法在每个服务器上运行那么多的映射插槽,但是在集群中有更多的服务器时,您仍然可以并行处理作业。
https://stackoverflow.com/questions/5606927
复制相似问题