hadoop2.2+mahout0.9实战

本文介绍如何在Hadoop2.2.0环境下使用Mahout0.9版本进行协同过滤推荐算法的实现与测试,包括解决版本兼容问题、配置Eclipse开发环境、编写测试代码及运行结果。

版本:hadoop2.2.0,mahout0.9。

使用mahout的org.apache.mahout.cf.taste.hadoop.item.RecommenderJob进行测试。

首先说明下,如果使用官网提供的下载hadoop2.2.0以及mahout0.9进行调用mahout的相关算法会报错。一般报错如下:

 
  1. java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected
  2. at org.apache.mahout.common.HadoopUtil.getCustomJobName(HadoopUtil.java:174)
  3. at org.apache.mahout.common.AbstractJob.prepareJob(AbstractJob.java:614)
  4. at org.apache.mahout.cf.taste.hadoop.preparation.PreparePreferenceMatrixJob.run(PreparePreferenceMatrixJob.java:73)
  5. at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)

这个是因为目前mahout只支持hadoop1 的缘故。在这里可以找到解决方法:https://issues.apache.org/jira/browse/MAHOUT-1329。主要就是修改pom文件,修改mahout的依赖。

大家可以下载修改后的源码包(http://download.csdn.net/detail/fansy1990/7165957)自己编译mahout(mvn clean install -Dhadoop2 -Dhadoop.2.version=2.2.0 -DskipTests),或者直接下载已经编译好的jar包(http://download.csdn.net/detail/fansy1990/7166017、http://download.csdn.net/detail/fansy1990/7166055)。

接着,按照这篇文章建立eclipse的环境:http://blog.csdn.net/fansy1990/article/details/22896249。环境配置好了之后,需要添加mahout的jar包,下载前面提供的jar包,然后导入到java工程中。

编写下面的java代码:

 
  1. package fz.hadoop2.util;
  2.  
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.yarn.conf.YarnConfiguration;
  5.  
  6. public class Hadoop2Util {
  7. private static Configuration conf=null;
  8. private static final String YARN_RESOURCE="node31:8032";
  9. private static final String DEFAULT_FS="hdfs://node31:9000";
  10. public static Configuration getConf(){
  11. if(conf==null){
  12. conf = new YarnConfiguration();
  13. conf.set("fs.defaultFS", DEFAULT_FS);
  14. conf.set("mapreduce.framework.name", "yarn");
  15. conf.set("yarn.resourcemanager.address", YARN_RESOURCE);
  16. }
  17. return conf;
  18. }
  19. }

 
  1. package fz.mahout.recommendations;
  2.  
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.util.ToolRunner;
  5. import org.apache.mahout.cf.taste.hadoop.item.RecommenderJob;
  6. import org.junit.After;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9.  
  10. import fz.hadoop2.util.Hadoop2Util;
  11. /**
  12. * 测试mahout org.apache.mahout.cf.taste.hadoop.item.RecommenderJob
  13. * environment:
  14. * mahout0.9
  15. * hadoop2.2
  16. * @author fansy
  17. *
  18. */
  19. public class RecommenderJobTest{
  20. //RecommenderJob rec = null;
  21. Configuration conf =null;
  22. @Before
  23. public void setUp(){
  24. // rec= new RecommenderJob();
  25. conf= Hadoop2Util.getConf();
  26. System.out.println("Begin to test...");
  27. }
  28. @Test
  29. public void testMain() throws Exception{
  30. String[] args ={
  31. "-i","hdfs://node31:9000/input/user.csv",
  32. "-o","hdfs://node31:9000/output/rec001",
  33. "-n","3","-b","false","-s","SIMILARITY_EUCLIDEAN_DISTANCE",
  34. "--maxPrefsPerUser","7","--minPrefsPerUser","2",
  35. "--maxPrefsInItemSimilarity","7",
  36. "--outputPathForSimilarityMatrix","hdfs://node31:9000/output/matrix/rec001",
  37. "--tempDir","hdfs://node31:9000/output/temp/rec001"};
  38. ToolRunner.run(conf, new RecommenderJob(), args);
  39. }
  40. @After
  41. public void cleanUp(){
  42. }
  43. }

在前面下载好了mahout的jar包后,需要把这些jar包放入hadoop2的lib目录(share/hadoop/mapreduce/lib,注意不一定一定要这个路径,其他hadoop lib也可以)。然后运行RecommenderJobTest即可。

输入文件如下:

 
  1. 1,101,5.0
  2. 1,102,3.0
  3. 1,103,2.5
  4. 2,101,2.0
  5. 2,102,2.5
  6. 2,103,5.0
  7. 2,104,2.0
  8. 3,101,2.5
  9. 3,104,4.0
  10. 3,105,4.5
  11. 3,107,5.0
  12. 4,101,5.0
  13. 4,103,3.0
  14. 4,104,4.5
  15. 4,106,4.0
  16. 5,101,4.0
  17. 5,102,3.0
  18. 5,103,2.0
  19. 5,104,4.0
  20. 5,105,3.5
  21. 5,106,4.0

输出文件为:

最后一个MR日志:

 
  1. 2014-04-09 13:03:09,301 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - io.sort.factor is deprecated. Instead, use mapreduce.task.io.sort.factor
  2. 2014-04-09 13:03:09,301 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.map.child.java.opts is deprecated. Instead, use mapreduce.map.java.opts
  3. 2014-04-09 13:03:09,302 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - io.sort.mb is deprecated. Instead, use mapreduce.task.io.sort.mb
  4. 2014-04-09 13:03:09,302 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.task.timeout is deprecated. Instead, use mapreduce.task.timeout
  5. 2014-04-09 13:03:09,317 INFO [main] client.RMProxy (RMProxy.java:createRMProxy(56)) - Connecting to ResourceManager at node31/192.168.0.31:8032
  6. 2014-04-09 13:03:09,460 INFO [main] input.FileInputFormat (FileInputFormat.java:listStatus(287)) - Total input paths to process : 1
  7. 2014-04-09 13:03:09,515 INFO [main] mapreduce.JobSubmitter (JobSubmitter.java:submitJobInternal(394)) - number of splits:1
  8. 2014-04-09 13:03:09,531 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - fs.default.name is deprecated. Instead, use fs.defaultFS
  9. 2014-04-09 13:03:09,547 INFO [main] mapreduce.JobSubmitter (JobSubmitter.java:printTokens(477)) - Submitting tokens for job: job_1396479318893_0015
  10. 2014-04-09 13:03:09,602 INFO [main] impl.YarnClientImpl (YarnClientImpl.java:submitApplication(174)) - Submitted application application_1396479318893_0015 to ResourceManager at node31/192.168.0.31:8032
  11. 2014-04-09 13:03:09,604 INFO [main] mapreduce.Job (Job.java:submit(1272)) - The url to track the job: http://node31:8088/proxy/application_1396479318893_0015/
  12. 2014-04-09 13:03:09,604 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1317)) - Running job: job_1396479318893_0015
  13. 2014-04-09 13:03:24,170 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1338)) - Job job_1396479318893_0015 running in uber mode : false
  14. 2014-04-09 13:03:24,170 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1345)) - map 0% reduce 0%
  15. 2014-04-09 13:03:32,299 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1345)) - map 100% reduce 0%
  16. 2014-04-09 13:03:41,373 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1345)) - map 100% reduce 100%
  17. 2014-04-09 13:03:42,404 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1356)) - Job job_1396479318893_0015 completed successfully
  18. 2014-04-09 13:03:42,485 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1363)) - Counters: 43
  19. File System Counters
  20. FILE: Number of bytes read=306
  21. FILE: Number of bytes written=163713
  22. FILE: Number of read operations=0
  23. FILE: Number of large read operations=0
  24. FILE: Number of write operations=0
  25. HDFS: Number of bytes read=890
  26. HDFS: Number of bytes written=192
  27. HDFS: Number of read operations=10
  28. HDFS: Number of large read operations=0
  29. HDFS: Number of write operations=2
  30. Job Counters
  31. Launched map tasks=1
  32. Launched reduce tasks=1
  33. Data-local map tasks=1
  34. Total time spent by all maps in occupied slots (ms)=5798
  35. Total time spent by all reduces in occupied slots (ms)=6179
  36. Map-Reduce Framework
  37. Map input records=7
  38. Map output records=21
  39. Map output bytes=927
  40. Map output materialized bytes=298
  41. Input split bytes=131
  42. Combine input records=0
  43. Combine output records=0
  44. Reduce input groups=5
  45. Reduce shuffle bytes=298
  46. Reduce input records=21
  47. Reduce output records=5
  48. Spilled Records=42
  49. Shuffled Maps =1
  50. Failed Shuffles=0
  51. Merged Map outputs=1
  52. GC time elapsed (ms)=112
  53. CPU time spent (ms)=1560
  54. Physical memory (bytes) snapshot=346509312
  55. Virtual memory (bytes) snapshot=1685782528
  56. Total committed heap usage (bytes)=152834048
  57. Shuffle Errors
  58. BAD_ID=0
  59. CONNECTION=0
  60. IO_ERROR=0
  61. WRONG_LENGTH=0
  62. WRONG_MAP=0
  63. WRONG_REDUCE=0
  64. File Input Format Counters
  65. Bytes Read=572
  66. File Output Format Counters
  67. Bytes Written=192

说明:由于只测试了一个协同过滤算法的程序,其他的算法并没有测试,如果其他算法在此版本上有问题,也是可能有的。

分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990

内容概要:本文围绕基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化问题展开研究,旨在通过智能优化算法有效降低网络损耗、提升电压质量并增强配电系统的运行效率。研究系统地介绍了小生境粒子群算法的改进策略,构建了包含功率平衡、电压安全、设备容量等多重约束的多目标优化模型,并采用IEEE标准测试系统进行仿真验证,充分证明了该方法在处理多目标、多约束优化问题上的优越性能。全文涵盖从数学建模、算法设计、约束处理到多目标折衷解选择的完整流程,并配套提供了完整的Matlab代码实现,便于读者复现结果与进行二次开发。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事电力系统优化、智能算法研究或相关领域工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决配电网中有功与无功功率的协同优化问题,实现节能降耗与电压稳定;②学习并掌握多目标粒子群算法及其小生境改进策略在电力系统中的具体应用与实现细节;③通过Matlab代码进行仿真,加深对智能优化算法在工程实践中应用的理解,提升科研与工程实践能力。; 阅读建议:此资源以理论分析与代码实现紧密结合的方式呈现,建议读者在深入理解算法原理和模型构建的基础上,结合所提供的Matlab代码进行仿真实验,重点关注参数设置、收敛性分析与结果可视化等关键环节,从而实现从理论认知到实践验证的完整闭环。
内容概要:本文系统阐述了LVGL(Light and Versatile Graphics Library)嵌入式轻量化图形界面开发的完整技术体系,涵盖从架构原理、环境搭建、控件开发、样式美化、事件机制到硬件移植与性能优化的全流程。深入剖析LVGL的分层架构、对象化编程思想、脏区局部刷新算法、内存管理与低功耗调度机制,并通过PC仿真与可视化工具提升开发效率。全面讲解基础与高级控件的手写实现、UI样式定制、中文字库适配、动画特效开发,并以STM32等主流平台为例,详细演示硬件移植全过程。最后通过一个集数据可视化、多页面导航、参数设置与传感器联动于一体的智能触控终端综合项目,实现理论与实践的深度融合。; 适合人群:具备C语言基础和嵌入式开发经验的工程师、电子信息类专业学生、参与大创或竞赛的开发者,以及从事工业控制、物联网、智能设备研发的技术人员。; 使用场景及目标:① 掌握LVGL在无操作系统MCU上的移植与运行机制;② 实现嵌入式设备的高质量GUI界面开发,包括中文显示、流畅动画与低功耗优化;③ 构建具备多页面、数据联动与用户交互的工业级触控终端项目,满足产品化与结题展示需求。; 阅读建议:学习过程中应结合仿真环境与实际硬件平台同步实践,重视lv_conf.h配置、HAL层接口适配与调试方法,建议按照“仿真验证→代码理解→硬件移植→项目集成”的路径循序渐进,重点关注内存管理、事件机制与性能优化等易出错环节。
内容概要:本文围绕“高效的球形通量计算(2D)研究”展开,基于Matlab实现相关算法,旨在提升二维空间中球形通量的计算效率与精度。研究聚焦于数值积分方法的优化,结合几何建模与数学分析手段,针对传统计算过程中存在的复杂度高、耗时长等问题,提出简化的算法流程与高效的数值求解策略。通过模块化代码设计与关键算法优化,显著提升了通量计算的运行效率与结果稳定性,适用于物理场仿真、电磁学分析、热力学建模及环境科学等需要频繁进行区域通量估算的工程与科研场景。文中提供了完整的Matlab代码实现,便于读者复现与拓展应用。; 适合人群:具备Matlab编程基础,从事科研或工程仿真的研究生、工程师及科研人员,尤其适合在物理、电磁、能源、图像处理或环境工程等领域有数值计算需求的技术人员。; 使用场景及目标:①应用于科学计算中二维球形区域内通量的高效求解,如电场、磁场或热量通量的定量分析;②服务于教学演示、算法性能对比研究及工程仿真平台开发,提升复杂积分问题的求解速度与准确性。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注算法实现细节与性能优化策略,深入理解数值积分与几何建模的结合方式,并参考文档中提到的技术方向拓展至三维场景或其他物理场的通量计算应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值