我正在尝试实现一个MapReduce作业,除了实际数据集(输入)之外,还可以处理大文本文件(作为查找文件)。查找文件超过2GB。 我尝试将文本文件作为第三个参数加载,如下所示:
但我遇到了Java堆空间错误。
进行一些搜索后,建议使用分布式缓存。这就是我到目前为止所做的 首先,我使用此方法来读取查找文件:
public static String readDistributedFile(Context context) throws IOException {
URI[] cacheFiles = context.getCacheFiles();
Path path = new Path(cacheFiles[0].getPath().toString());
FileSystem fs = FileSystem.get(new Configuration());
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path)));
String line;
while ((line = br.readLine()) != null) {
// split line
sb.append(line);
sb.append("\n");
}
br.close();
return sb.toString();
}
第二,在Mapper中:
protected void setup(Context context)
throws IOException, InterruptedException {
super.setup(context);
String lookUpText = readDistributedFile(context);
//do something with the text
}
第三,运行工作
hadoop jar mapReduceJob.jar the.specific.class -files ../LargeLookUpFileInStoredLocally.txt /user/name/inputdataset/*.gz /user/name/output
但问题是这项工作需要很长时间才能加载。 可能是使用分布式缓存不是一个好主意,也可能是我在代码中遗漏了一些内容。
我正在使用Hadoop 2.5。 我已经检查了一些相关的问题,如[1]。
任何想法都会很棒!
[1] Hadoop DistributedCache is deprecated - what is the preferred API?
答案 0 :(得分:0)
分布式缓存主要用于移动任务节点上Map reduce所需的文件,而不是jar的一部分。
其他用法是在执行包含大小数据集的连接时,因此,我们使用单个输入(大)文件,而不是使用多个输入路径,并使用分布式缓存获取另一个小文件然后进行比较(或加入)两个数据集。
在你的情况下有更多时间的原因是因为你试图在map reduce开始之前读取整个2 gb文件(因为它是在setup方法中启动的)。
您能否说明使用分布式缓存加载庞大的2gb文件的原因。