【发布时间】:2016-07-29 17:15:06
【问题描述】:
我对 Mahout/Hadoop 环境相当陌生,所以如果这个问题是微不足道的,我深表歉意,但是我还没有找到任何直接的答案。
有一个带有 Mahout 的 EMR 集群,我可以在其中提交以下标准推荐作业:
mahout recommenditembased --input s3a://input-bucket/ratings_small.csv
--output s3a://output-bucket/out/ --numRecommendations 2
--similarityClassname SIMILARITY_COSINE
一切都很好,但它需要我通过 SSH 连接到主节点。
现在我正在考虑自动执行此操作,以便专用 Lambda 函数向 EMR 提交一个步骤并忘记它。最简单的方法是什么?是否可以在不使用 Java 编写整个推荐应用程序的情况下将其作为 Hadoop 的 JAR 步骤提交?
----- 2016 年 4 月 10 日更新 ------
在深入研究之后,最简单的选项(至少对我而言)原来是 EMR 集群上的“自定义 JAR”作业,具有以下参数:
名称:任意步骤名称
JAR 位置:
/usr/lib/mahout/mahout-mr-0.12.2-job.jar-
参数:
org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input s3a://your-bucket/input/ --output s3a://your-bucket/output/ --similarityClassname SIMILARITY_EUCLIDEAN_DISTANCE --tempDir temp/random_guid/ 对失败的操作 - 继续。
显然,您也可以通过 AWS CLI 或 SDK 完全以编程方式提交上述作业。
注意:我在参数中使用了--tempDir,因为每次执行推荐器时,Mahout都会在HDFS中创建一个临时目录(默认为temp/)。但是,Mahout 不会在计算完成后删除该目录。因此,如果您连续提交 2 个推荐人作业,则第二个将失败并出现类似于
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory temp/preparePreferenceMatrix/itemIDIndex already exists
当我以编程方式提交推荐工作时,我决定为每个工作使用带有随机 guid 的不同临时目录。或者,您可以在提交新目录之前手动删除由上一个作业创建的临时目录。
【问题讨论】:
标签: hadoop aws-lambda amazon-emr mahout-recommender