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

标签 memory hadoop mapreduce compare overflow

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

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

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

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

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

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

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

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

最佳答案

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

关于memory - 比较使用 Map Reduce(Cloudera Hadoop 0.20.2)两个大小接近 3GB 的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606927/

相关文章:

c++ - 我的代码会导致内存泄漏吗?

linux - 应用处理器内存映射

Java - 处理内存中的文件而不需要磁盘R/W

java - Hadoop调试:源附件

java - 如果我更新 url 过滤器文本,我需要从命令行调用什么 Nutch 命令

hadoop - Hadoop M/R作业链接无一异常(exception)都无法正常工作

vba - Excel VBA 内存不足

hadoop - 从数据库导入数据时,Sqoop创建了太多小文件

hadoop - Apriori 和关联规则与 Hadoop

python - Pyspark MapReduce对象列表