1

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

我正在实现 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 目录,其中存储了新计算的质心

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

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

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

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

4

1 回答 1

0

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

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

您可以通过遍历 Path[] 数组来做到这一点

Path[] cacheFiles;
于 2013-10-24T10:22:03.260 回答