我正在Hadoop(旧API)上实现K-Means算法,我被困在一个点上,我无法弄清楚如何进一步进行。
我的逻辑是:
保持两个文件质心&数据。
- 第一步:读取质心文件& 将此数据存储在某些
- 步骤2:然后通过mapper读取数据文件,因为它将逐行扫描,然后将此值与列表中已经存储的质心进行比较。
- 步骤3:输出相应质心&
- 步骤4: Reducer将处理新的质心并将其与数据一起发出。
list(ArrayList)
中。我的问题
- 我的流程正确吗?
- 是正确的方式来存储质心文件首先在一些收集,然后进一步进行?
- 如果我使用方法(2),那么我的问题是如何将此质心文件存储在一些集合中,因为地图函数将逐行扫描文件,所以如何在运行数据文件上的映射器之前先扫描此质心文件? 什么应该是一个更好的方式来处理这个质心文件功能?
-
我看你的流量还可以。你不应该"读取"你的数据文件,你应该只是指定作为你的输入到hadoop程序。除此之外,虽然并不总是理想的MapReduce/Hadoop系统可以很好地进行迭代算法。只要确保将reducer的输出链接到映射器的输入。
-
是正确的,您可以使用分布式缓存,或者只是将文件存储在hdfs路径下。在映射器开始时读取质心文件可以在"setup"方法中完成。
<>之前MyMapper扩展Mapper@Override保护无效设置(上下文上下文){//设置代码。读取质心文件}} -
查看我上面的代码,使用"setup"方法
-
我认为质心文件是好的,该文件将是微不足道的传递,因为它的大小非常小(除非你试图有数百万的集群…)
Hadoop不是K-means的最佳选择,因为您需要运行多个map-reduce才能获得结果。也就是说,Apache Mahout包含了Hadoop的k-means实现,你可以使用它(或者看看它的实现)。
Apache Hama是Hadoop之上的一个批量同步并行处理框架,它更适合,因为它允许参与组件之间的消息传递,并且它有k-means实现[3]。当YARN结束测试时,在Hadoop 2上看到这样的解决方案会更常见