我的问题可能听起来很愚蠢,但我是 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:我是否访问了正确的文件?