分布式缓存文件检索问题

时间:2013-10-23 19:06:43

标签: hadoop mapreduce cloudera hadoop-streaming

我的问题可能听起来很愚蠢,但我是Hadoop map的新手。所以我很难弄明白。

我正在实现K意味着在map reduce中使用Cloudera CDH4(4.1.1)进行聚类。
数据由具有x和y坐标的点组成。因此,我在每一步更新质心,直到所有质心的变化小于0.1。

因此,对于第一次迭代,我使用

将样本质心文件放在分布式缓存中
if (iteration == 0) {
    Path hdfsPath = new Path(input + "/centroid.txt");
    DistributedCache.addCacheFile(hdfsPath.toUri(), conf);
} else {
    Path hdfsPath = new Path(again_input + "/part-00000");
    DistributedCache.addCacheFile(hdfsPath.toUri(), conf);

对于下一次迭代,我正在获取与第一次迭代的输出相同的again_input目录,其中我存储了新计算的质心

然而,映射器再次获取它为第一次迭代提取的质心文件。
下面是在mapper类中获取质心文件的代码:

Path[] cacheFiles = DistributedCache.getLocalCacheFiles(job);
BufferedReader cacheReader = new BufferedReader(new FileReader(cacheFiles[0].toString()));

疑问1:分布式缓存是在作业完成后清除所有文件还是保留它们?对于例如centroid.txt在迭代1后被清除。

疑惑2:我是否正在访问正确的文件?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您是否在迭代中重用Configuration类对象conf

我认为这是问题所在。您能否检查哪些文件被添加到第二次迭代作业的分布式缓存中?

你可以通过迭代Path [] Array

来做到这一点
Path[] cacheFiles;