Hadoop分布式缓存用于处理大型查找文本文件

时间:2015-10-20 13:59:37

标签: java hadoop mapreduce

我正在尝试实现一个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?

1 个答案:

答案 0 :(得分:0)

分布式缓存主要用于移动任务节点上Map reduce所需的文件,而不是jar的一部分。

其他用法是在执行包含大小数据集的连接时,因此,我们使用单个输入(大)文件,而不是使用多个输入路径,并使用分布式缓存获取另一个小文件然后进行比较(或加入)两个数据集。

在你的情况下有更多时间的原因是因为你试图在map reduce开始之前读取整个2 gb文件(因为它是在setup方法中启动的)。

您能否说明使用分布式缓存加载庞大的2gb文件的原因。