我对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提交一个步骤并忘记它。这可能是最简单的方法吗?是否可以将其作为HARop的JAR步骤提交而无需在Java中编写整个推荐应用程序?
------更新时间04/10/2016 ------
经过一段时间的挖掘后,最简单的选择(至少对我来说)是一个" Custom JAR"使用以下参数在EMR集群上工作:
名称:任意步骤名称
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来完成每项工作。或者,您可以在提交新目录之前手动删除由上一个作业创建的临时目录。
答案 0 :(得分:0)
最简单的方法是使用EMR数据管道模板,这非常适合自动化。
答案 1 :(得分:0)
这取决于这个集群是否会保持一段时间? AWS Data Pipeline实际上是为单一用途群集而设计的。对于需要安排作业定期运行的长时间运行的集群来说,这并不能很好地解决这个问题。
如果您希望定期运行此功能,则可以考虑使用常规EMR群集,然后使用Oozie安排工作。在这里你需要创建一个包含所有Mahout内容的jar。
最后,如果您发现要缩小和扩展群集以用于更大和更小的作业,您可以使用调整大小工具,使您可以使用EMR群集,而不支持自动缩放开箱即用,看看这篇文章
http://www.lopakalogic.com/articles/hadoop-articles/dynamically-resize-emr/
源代码可在Github上找到,链接在文章中。