2

我正在 Hadoop(旧 API)上实现 K-Means 算法,但我陷入了无法弄清楚如何进一步进行的地步。

到目前为止,我的逻辑是:

维护两个文件质心和数据。

  • 第 1 步:读取质心文件并将这些数据存储在一些list(ArrayList).
  • 第 2 步:然后通过映射器读取数据文件,因为它将逐行扫描,然后将此值与列表中已存储的质心进行比较。
  • Step 3 : 将对应的centroid & data 输出到reducer。
  • 第 4 步:Reducer 将处理新的质心并将其与数据一起发出。

我的问题

  1. 我的流程正确吗?
  2. 将质心文件首先存储在某个集合中然后继续进行是否是正确的方法?
  3. 如果我采用方法(2),那么我的问题是如何将这个质心文件存储在某个集合中,因为映射函数将逐行扫描文件,所以如何在数据文件上运行映射器之前先扫描这个质心文件?
  4. 处理此质心文件功能的更好方法应该是什么?
4

2 回答 2

2
  1. 你的流程在我看来几乎没问题。您不应该“读取”您的数据文件,而应该将其指定为 hadoop 程序的输入。除此之外,虽然并不总是理想的 MapReduce/Hadoop 系统可以很好地执行迭代算法。只需确保将 reducer 的输出链接到 mapper 的输入即可。

  2. 是的,这是正确的,您可以使用分发缓存,也可以将文件存储在 hdfs 路径中。在映射器开始时读取质心文件可以在“设置”方法中完成。

    公共类 MyMapper 扩展 Mapper{
        @覆盖
        受保护的无效设置(上下文上下文){
            //设置代码。读取质心文件
        }
    }
    
  3. 请参阅上面的代码,使用“设置”方法。

  4. 我认为质心文件很好,由于它的尺寸非常小,该文件将很容易传递(除非你试图拥有数百万个集群......)

于 2013-04-29T04:50:40.027 回答
1

Hadoop 不是最适合 K-means 的,因为您需要运行多个 map-reduce 才能获得结果。也就是说 Apache Mahout 包含 Hadoop 的k-means 实现,您可以使用它(或查看它的实现)。

Apache Hama是 Hadoop 之上的批量同步并行处理框架,它更适合,因为它允许在参与的组件之间传递消息,并且它具有 k-means 实现 [3]。当YARN退出测试版时,在 Hadoop 2 上看到这样的解决方案会更常见

于 2013-04-29T03:18:10.727 回答