【发布时间】:2011-04-09 18:19:58
【问题描述】:
我正在尝试在 hadoop map/reduce 中执行以下操作(用 java 编写,linux 内核操作系统)
文本文件 'rules-1' 和 'rules-2'(总共 3GB 大小)包含一些规则,每条规则以结束符分隔,因此可以使用 readLine() 函数读取文件。
-
这些文件 'rules-1' 和 'rules-2' 需要从我集群中每个映射函数的 hdfs 整体导入,即这些文件不能跨不同映射函数拆分。
映射器的 map 函数的输入是一个名为“record”的文本文件(每行以结束行字符终止),因此从“record”文件中我们得到 (key, value) 对。该文件是可拆分的,可以作为整个 map/reduce 过程中使用的不同 map 函数的输入。
需要做的是将每个值(即记录文件中的行)与“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