我是 Mahout 的新手。我想安装它并尝试一下。到目前为止,我已经在我的 Mac 上安装和配置了 Maven3 和 Java 1.6。我的问题是:
Do I have to install Hadoop firstly before installing Mahout?
有些教程包括安装 Hadoop,有些没有让我感到困惑。我知道 Mahout 是建立在 Hadoop 之上的。但并非所有 Mahout 都依赖于 Hadoop。
有人可以提供一些有关安装的有用的详细资源吗?
这 2 个链接帮助我在 OSX 上启动和运行。将 hadoop 与 mahout 一起使用并不是绝对必要的,但几乎可以肯定的是,如果您打算在可扩展的系统中使用,那么在使用这两种方法时获得经验会很有用......
现在已经过了两年,我终于得到了一个在 Mac 上运行的 itemsimilarity 命令,在经过大量的诅咒和一些鲜血之后,我给出了另一个答案......希望这可以节省一些时间和痛苦。除了我的同事!你的弱点让我恶心!反正...
首先对于“我是否需要 $FINICKY_BIG_DATA_PLATFORM”问题,请参阅:
http://mahout.apache.org/users/basics/algorithms.html
Hadoop 和/或 spark 不是硬性要求,一些算法在单台机器上运行。但是,您可能感兴趣的算法可能只能在 hadoop 和/或 spark 上运行。有关建议的文档也非常强烈地引导您运行基于 spark 的算法。他们还鼓励您使用黑盒命令行命令,这些命令在单机版本和 spark 版本之间可以有不同的参数(例如,项目相似性)。所以你不需要它,但你可能仍然需要它。
我尝试了 hadoop、apache-spark 和 mahout 的 brew 安装。如果您使用绝对最新版本(mahout 0.11.0、apache-spark 1.4.1、hadoop 2.7.1),您可能会遇到以下一些问题:
“出现错误找不到 Spark 类路径。是否设置了'SPARK_HOME'?”要解决此问题,您不仅需要设置该环境变量(我的设置为“/usr/local/Cellar/apache-spark/1.4. 1/libexec"),您还需要 ${SPARK_HOME}/bin/ 中显然已弃用的 compute-classpath.sh 脚本。我有一个方便的 1.2.0 spark 安装,所以我从那里拿起了一个。
额外的问题,在那个 1.2.0 安装中有两个 compute-classpath.sh 脚本,一个只是一个调用另一个的单行。如果您复制“真实”的,您可能会更快乐,所以少用一点来检查。
“ java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path ” 要解决这个问题,互联网会告诉您获取 libsnappyjava.jnilib 的副本,将其放入 /usr/lib/java 并重命名为 libsnappyjava.dylib。我做了“brew install snappy”,它安装了 1.1.3 版并包含名为 libsnappy.dylib 和 libsnappy.jnilib 的符号链接。请注意,这些只是符号链接,名称不太正确......所以在复制和重命名主 lib 文件后,我至少得到了一个新错误,这让我们......
" 线程 "main" java.lang.UnsatisfiedLinkError: org.xerial.snappy.SnappyNative.maxCompressedLength(I)I 中的异常 " Internet 不太愿意提出建议。我确实看到一篇帖子说版本 1.0.xxx 没有任何魔法小马代码,但版本 1.1.1.3 有。我去了http://central.maven.org/maven2/org/xerial/snappy/snappy-java/,下载了 snappy-java-1.1.1.3.jar 并将其按原样放入 /usr/lib/java ,没有名称更改。这使得快速错误消失了,我可以运行一个“mahout spark-itemsimilarity”命令来完成,YMMV,这个建议是按原样提供的,没有任何保证。
请注意,快速错误导致的绝望可能会促使您下载 spark .tgz 并从头开始构建它。构建过程将占用您大约 2 个小时的时间,您将永远无法恢复,并且最终您仍然会遇到快速错误。最终,我可以使用这个手工构建的版本运行与 brew 安装版本相同的命令,snappy jar 最终成为主要的东西。
你根本不需要 hadoop 来尝试 mahout。下面是一个示例代码,它将模型作为文件的输入,并将打印推荐。
package com.ml.recommend;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
public class App {
public static void main(String[] args) throws IOException, TasteException {
DataModel model = new FileDataModel(new File("data.txt"));
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(3,
userSimilarity, model);
Recommender recommender = new GenericUserBasedRecommender(model,
neighborhood, userSimilarity);
Recommender cachingRecommender = new CachingRecommender(recommender);
List<RecommendedItem> recommendations = cachingRecommender.recommend(
1000000000000006075L, 10);
System.out.println(recommendations);
}
}