K-Means Algorithm Hadoop



我正在Hadoop(旧API)上实现K-Means算法,我被困在一个点上,我无法弄清楚如何进一步进行。

我的逻辑是:

保持两个文件质心&数据。

  • 第一步:读取质心文件&
  • 将此数据存储在某些list(ArrayList)中。
  • 步骤2:然后通过mapper读取数据文件,因为它将逐行扫描,然后将此值与列表中已经存储的质心进行比较。
  • 步骤3:输出相应质心&
  • 步骤4: Reducer将处理新的质心并将其与数据一起发出。

我的问题

  1. 我的流程正确吗?
  2. 是正确的方式来存储质心文件首先在一些收集,然后进一步进行?
  3. 如果我使用方法(2),那么我的问题是如何将此质心文件存储在一些集合中,因为地图函数将逐行扫描文件,所以如何在运行数据文件上的映射器之前先扫描此质心文件?
  4. 什么应该是一个更好的方式来处理这个质心文件功能?
  1. 我看你的流量还可以。你不应该"读取"你的数据文件,你应该只是指定作为你的输入到hadoop程序。除此之外,虽然并不总是理想的MapReduce/Hadoop系统可以很好地进行迭代算法。只要确保将reducer的输出链接到映射器的输入。

  2. 是正确的,您可以使用分布式缓存,或者只是将文件存储在hdfs路径下。在映射器开始时读取质心文件可以在"setup"方法中完成。

    <>之前MyMapper扩展Mapper@Override保护无效设置(上下文上下文){//设置代码。读取质心文件}}
  3. 查看我上面的代码,使用"setup"方法

  4. 我认为质心文件是好的,该文件将是微不足道的传递,因为它的大小非常小(除非你试图有数百万的集群…)

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

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

相关内容

  • 没有找到相关文章

最新更新