gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:34:48 26 4
gpt4 key购买 nike

我正在尝试在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com