毕业设计(论文)-基于Hadoop协同过滤的商品推荐设计.docx
毕业设计说明书基于Hadoop协同过滤的商品推荐2017年05月17日基于Hadoop协同过滤的商品推荐摘要:目前单机推荐系统己经不能计算海量数据和存储等需求,分布式的推荐系统现在已经成为今年来的热点。基于Hadoop的电商的分布式大型推荐系统这一课题,我通过阅读大量的文献和研究,分析了国内外研究现状及面临问题。对电子商务推荐系统常见的推荐算法讨论,还有本文还对Hadoop平台的两大核心技术HDFS和MapReduce的工作流程和原理进行了介绍。对于电子商务传统推荐系统存在的很多问题,我论文基于Hadoop的电商推荐系统,系统有Hadoop的优点能具备良好的可扩展性伸缩性,可以方便快捷的对系统的计算能力和存储能力调大调小根据业务需求进行调整。对数据预处理、基于物品的协同过滤推荐算发还有混合推荐算法的相似性计算等算法设计,使之完美的运行在HadOOP平台上,实现分布式的推荐计算。关键词:电子商务;推荐系统;协同过滤;HadoopProductrecommendationbasedonHadoopcollaborativefilteringAbstract:Atpresent,thesinglerecommendationsystemhasnotbeenabletocalculatethemassdataandstoragerequirements,andthedistributedrecommendationsystemhasbecomeahottopicthisyear.Hadoop-basede-commercerecommendationsystemofthissubject,byreadingalotofliterature,analysisThestatusquoandproblemsathomeandabroad.ThispaperalsointroducestheworkflowandprinciplesofHDFSandMapReduce,thetwocoretechnologiesofHadoopplatform,whicharethecommonrecommendationalgorithmsforE-commercerecommendationsystem.Fortheexistingproblemsoftraditionale-commercerecommendationsystem,wedesignedHadoop-basede-commercerecommendationsystem,thesystemhasgoodscalabilityandscalability,youcaneasilycalculatethesystemandstoragecapacityaccordingtobusinessneedstoadjust.Thedatapreprocessing,basedonthecollaborativefilteringofitems,isalsobasedonthesimilaritycalculationofthehybridrecommendationalgorithm,sothatitcanrunperfectlyontheHadoopplatformtorealizethedistributedrecommendationcalculationKeyWords:e-commerce;recommendationsystem;collaborativefiltering;Hadoop摘要IAbstractII1绪论11.I研究背景与意义11.1.1信息过载与个性化服务11.2现阶段关于推荐系统的现状21. 3论文的主要工作及结构安排42. Hadoop简介52.1Hadoop简介52.2Hadoop生态简介52.3详细介绍HDFS和MapReduce62 .3.1HDFS63 .3.2MapReduce74 .商品推荐系统的设计85 .具体的算法实现和效果101.1 1数据切分101.2 用户向量114.4 用户矩阵乘以共现矩阵124.5 按商品ID做累加134.6 除去用户已经购买过商品134.7 验证135.实验151 .1数据集的介绍155 .2实验平台简介15附录A17附录B20附录C23附录D26附录E28附录F33参考文献501绪论11研究背景与意义1.1.1信息过载与个性化服务随着计算机和互联网技术的快速发展,互联网上信息和用户的数量呈指数增长,全世界各地的用户提供了越来越丰富的资源,海量信息给用户带来更多选择的同时,也使的用户难以及时地吸收、消化和使用信息,还有是信息的广泛性,也容易使用户常常容易迷失航向,没有办法快速准确地找到特定的信息,形成了“信息过载(InfOnnatiOnOverload),和“信息迷失(InfonnationLost),的现象。在互联网技术日益发达的今天,使越来越多的用户喜欢上网冲浪,在线购物。我们在享受其给我们带来便利的同时也面临着它给我们带来的困扰,随着电子商务网站日益扩大,商品的数量不断增加,种类也是多种多样。在海量商品中找到对自己要用的商品变得越来越困难,用户在选购商品时,要花费大量的时间和精力在众多商品中进行比较和挑选。这样,降低了用户的体验,随着网站的访问量跟着降低,商品的销售量自然而然受到影响。信息的过载的问题:海量的信息共同一时间呈现的话会超过了单个人亦或者整个系统所能接受的信息的处理范围,使的信息使用率降低。当然信息爆炸现象也不是第一次进入们的一举一动,成为信息的生产者,现阶段分享交流的平台蓬勃发展,随时随地使得大量的信息的传播与接收。中文互联网数据研究资讯中心的一份统计显示,每天数以亿计的网络信息被产生、被分享、被接收,其中只有20%的搜索结果可靠而有用,94%的人感觉“信息过载”。面对信息过载问题,解决办法有很多种,传统的解决方窠有分类目录和搜索引擎两种方案。分类目录就是商品做了分门别类,方便用户在查找的时候可以根据类别查找商品。国内很多家电商网站传统上都是这样做的,但是随着商品规模的不断增加,分类目录只能覆盖一部分商品,一部分商品不好进行分类,也是可以很难满足大家常用的需求,第二种是搜索引擎,搜索引擎可以根据用户提供的关键词来找到人们需要的商品,现阶段电商网站这块也是做的特别好,但是当用户无法准确的找出来描述商品的关键词的时候,这就暴露搜索引擎的缺点。然而推荐系统则正好可以弥补搜索引擎的这个缺陷,推荐系统则不需要用户有明确的要求,推荐系统是根据用户的历史行为而进行建模,然后主动给用户推荐可能满足用户兴趣和需求的商品。在如今的大数据和互联网的时代,现有的电子商务网站中的推荐系统面临着极大的考验。尤其是进入移动互联网的时代,用户随时随地的很方便的网上购物,用户的每个行为都是信息,电商网站的用户、商品数量快速增长。指数增长的用户和数据量对电商,传统的数据存储和计算速度是个挑战。传统的单个机器下的推荐算法现在基本不能满足电商需求,所以需要研究分布式的推荐算法系统,Hadoop是一个分布式并行计算框架,它可以满足分布式的存储功能和并行计算功能,并且HadOOP具有良好的可扩展性,所需要的服务器的性能也要求不是很高,一般的普通商用服务器就可以满足具体要求我将会早下章节中介绍。1.2现阶段关于推荐系统的现状推荐系统己经在很多领域取得了成功,是一个比较成熟的技术算法,最典型的是电子商务领域的亚马逊,亚马逊在很早以前就将推荐系统运用于自己的电商网站上。包括现在很多教课书上的举例子都是在用亚马逊来做示例,我们在亚马逊搜索“MahoutinAction"这本书,我们会看到两个推荐区域,图IT上面一个区域是向用户推荐通常和“MahoutinAction"这本书一起买的其他书,这里运用的是基于关联规则的推荐算法。图1.2下面一个区域是向用户推荐买了"MahoutinAction"这本书的人也会买的其他书,这里运用的是基于物品的协同过滤推荐算法。据亚马逊前科学家GregLirlden介绍,亚马逊至少有35%的销售额来自于推荐系统。亚马逊CEOJeffBeZOS曾经说过亚马逊,亚马逊相对于其他电子网购网站最大的优势是推荐系统。推荐系统也在世界上最大的在线电影租赁公司Netflix取得了很大的成功,有75%是通过推荐系统成功推销给用户Netflix公司也非常重视推荐系统,公司自2006年起每年都会举办NetflixPriZe推荐系统比赛。比赛会给将公司推荐算法的预测准确度提升10%的队伍奖励100万美元。虽然电子商务推荐系统经过十几年的发展,在国内外学术界和工业界都已经有了很多的成果,但是将推荐系统与Hadoop平台相结合研究分布式的处于起步阶段。相对成熟的是ApacheMahout里面包含有基于Hadoop的推荐系统的算法,但是相对来说比较不灵活,不能适合应用于复杂的生产环境中,还有是Hadoop的不合适多轮的迭代,Apachespark解决了这类问题,ApacheSpark;里面包含了MaChinLearning的包,补全了HadoOP迭代慢的缺陷,但是这些研究都只是针对特定的场景,现实生产的环境,还需要重新开发。经常一起购买的商品本商品:MahoUt实战-(SeanOwen)平装¥68.80,机器学习实战-哈林顿(PeterHarrington)三装¥54.50图1.1购买此商品的顾客也同时购买Hive 二机器学习实故 哈林领(Pete./ 129程¥54.50。EeI“,e£MahOUt ©法解析与案例实哉AMM* MlaMMHiVe霾程指南 卡普廖吉(Edw .16葆¥54.50 SWmeMahOUtM法解帆与案例实 战 要哲¥ 50.10 WrifneSPar顺速大到席分忻 闺卡芳闺.“ 18¥46.60 rime图1.21.3论文的主要工作及结构安排本文是对电商中对常见的推荐算法分析,侧重点为研究协同过滤算法,并且对各个算法进行了比较,有电子商务推荐系统面临的计算效率、可扩展性、灵活性等问题,本文先对Hadoop平台的两大核心技术HDFS分布式文件系统和MapReduce并行计算框架的原理和使用进行了分析,并且在此基础上设计了基于HadooP的电子商务推荐系统,推荐算法运行在HadOoP平台上。本文的章节安排如下:第一章:绪论。研究背景与意义。信息过载与个性化服务现阶段关于推荐系统的现状论文的主要工作及结构安排第二章:APaCheHadoop平台,此章节对Hadoop生态简单描述,HDFS分布式文件系统MapReduce并行计算框架运行流程进行了较为详细的分析。第三章:HadOoP的电商的推荐系统设计。基于Hadoop大型分布式大处理处理系统实现分析并设计合适的Map方案和Reduce方案来实现了协同过滤推荐算法并行化。第四章:基于Hadoop推荐系统算法具体实现。具体是Hadoop平台上运行分布式推荐算法,本论文主要介绍ItemCF算法。第五章:实验。用HadooP平台的电商推荐系统进行了实验,包括对实验的环境简单介绍、数据集采集、进行描写。最后对实验结果进行了分析。2.Hadoop简介2.1Hadoop简介APaChe的HadOoP项目是可靠的、可扩展的开发开源软件,分布式计算框架mOHadoop是一个大数据框架,它允许大型数据集在使用简单的编程模型后在计算机集群上做分布式处理。它的目的是从单一的服务器扩展到成千上万的机器,每个提供本地计算和存储。而不是依靠硬件来提供高可用性,库本身的目的是检测和处理应用层的故障,所以提供了一个高度可用的服务上的计算机集群,因为其中每一个可能容易失败。该项目包括这些模块:HadoopCOmmon:支持其他Hadoop模块的共同事业。HadoopDistributedFileSystem(HDFSTM):分布式文件系统,HDFS高吞吐量访问APP程序数据和提供数据存储功能。HadoopYARN:用于作业调度和集群资源管理框架。HadoopMapReduce:MapReduce的Yarn为大数据集管理并行处理系统。2.2Hadoop生态简介Ambari:是一个基于网络工具进行配置,可以管理和监控的APaCheHadooP集群包括HadoopHDFS文件系统,支持Hadoop,Hive,hcatalog,HBase,ZooKeeper,Oozie,Pig和SqOOp。Ambari并且还提供个仪表板,可以查看集群健康,查看MapReduce计算能力,Pig和Hive的展示视觉和功能。Avro:数据序列化系统。Cassandra:可扩展的多主数据库没有单点故障。.Chukwa:Chukwa是一个分布式大型数据采集系统。HBase:一个用分布式的NoSQL数据库系统。Hive:数据仓库的基础设施,提供数据汇总和AdhoC查询。Mahout::MahOUt是APaChe一个可扩展的机器学习并且有数据挖掘库。Pig:一个高级的数据流语言和执行框架的并行计算Spark:快速并且通用型计算的Hadoop数据引擎可迭代。spark提供了可以通过简单的的编程模型,就可以实施大数据的运算,支持各种应用,这其中包括ETL还有,一部分机器学习、伪实时数据流处理、还有图形计算。Tez:ApacheTeZlM项目是在在构建一个APP框架,这个框架允许复杂的数据处理任务,但是必须是的有向无环图。Tez目前是构建APaCheHadOoPYARN上的。ZooKeeper:动物园管理员是一个高性能分布式应用的协调服务。他们的关系如图2.1:PlgChukwaHlveHBaseIapReduceHDFSZooKeepe图2.12.3详细介绍HDFS和MapReduce2.3.1HDFSHDFS(HadoopDistributedFileSystem)Hadoop分布式文件系统。是根据google发表的论文翻版的。论文为GFS(GoogleFileSystem)Google文件系统。HDFS有很多特点:a)备份多个副本,所以提供容错机制,副本损坏或机器的宕机都会有namenode进行自动恢复。默认存3份。b)运行在廉价的机器上。C)适合大数据的处理。HDFS系统默认情况下会将文件分割成block,128M为1个block。然后HDFS把block按照键值对的形式存储在HDFS上,并且将每一个键值对映射存储到内存中。如果小文件太多,那内存的负担会很重。IlDFS的角色:a)NameNode:是MaSter节点,是管理HDFS集群。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;b)SecondaryNameNode:是第二个NanIenode,用来分担主要namenode的工作量;是NanIeNode的冷备份;合并fsimage文件和fsedits文件然后再发送给namenode0c)DataNode;SlaVe节点、,用来存放真实数据。用来存储客户端发送来的数据块block;执行数据块的读写操作。d)热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。C)冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上也存储a的一部分信息,减少a坏掉后的损失。f)fsimage:是hdfs上的元数据的镜像文件,第二namenode合并的时候用比较多;g)edits:是HDFS对元数据的操作日志;h)namenode节点内存中存储的是二fsimage文件+edits文件。i)SccondaryNaincNode负责定时,默认时间1小时,从namcnodc上,获取fsimage文件和edits文件来进行合并,合并之后再发送给namenodeoNanIenode不需要合并,减少namenode的工作量。2 .3.2MapReduce文件被分片,每个输入分片会让一个map任务来处理,InaP任务来处理输入的文件,处理完成以后,可以在本地做一个Combiner,经过洗牌(ShUffIe)然后交给reducer线程处理,reducer做一个规约整合,就是一个完整的MapReducer过程。3 .商品推荐系统的设计协同过滤也称作协作过滤(CollaborativeFiltering),是众多推荐算法中被各大电商运用最多的推荐算法。协同过滤基于两点假设:(1)在一些方面有相同爱好的人,在别的方面也会有相似性,(2)人的爱好的长期性的,不会随便容易改变。本论文将侧重点介绍最常见的基于用户的协同过滤推荐算法(UBCF)和基于商品协同过滤推荐算法(IBCF)原始数据指的都是用户的历史行为数据,比如用户的购买历史,给物品评分等等,我们用这些数据来支持推荐系统,需要注意的是,不同的数据准确性不同,粒度大小也不同,在使用之前需要降噪计算用户的相似度:欧几里德距离N(i)nN(j)T(Ij)=VW(DIWO)I举个例子:A:abdB:bacC:cdD:bcdE:ad依此构建用户一一物品倒排表aAEbABDcBCDdACDEeB建立物品相似矩阵矩阵中记录了ij的位置记录了同时喜欢物品i和物品j的用户数c02021d22200eOllOOItemCF是经过下面的公式来计算一个用户u对一个物品j的兴趣:Puj=WWji*ruiiN(u)S(i,k)PUj表示用户U对物品j的兴趣N(U)表示用户喜欢的物品集合i是该用户喜欢的某一个物品S(i,k)物品i最相似K个物品集合j是这个集合中的某一个物品Wji表达物品j和物品i的相似度Rui表达用户u对物品i的兴趣,就是评分。此公式想要表达的意义是:我们根据用户历史购买数据,与用户买过的物品比较相似的物品,相似度越高,我们就给用户推荐。4 .具体的算法实现和效果4.1 数据切分我们原始数据为如图4.1:userID,movieID,rating,timestamp671,5902,3.5,1064245507671,5952,5.0,1063502716671,5989,4.0,1064890625671,5991,4.5,1064245387671,5995,4.0,1066793014671,6212,2.5,1065149436671,6268,2.5,1065579370671,6269,4.0,1065149201671,6365,4.0,1070940363671,6385,2.5,1070979663BrowseDirectoryZkangZsourcedataGofPermissionOwnerGroupSizeReplicationBtockSizeNamedrwxrxr-xLngpykangpyOB0OBa.ttfwrrkangpykangpy2.33MB3128MBratingsxsv图4.1首先进过第一个MaPRedUCe的程序,StepO,我们希望把原始数据切分为4等份,用其中三份数据份来做协同过滤,用一份未用过的数据来做验证我们算法的正确性;如图4.2切分完的数据集BrowseDirectory/long/OPermissionOwnerGroupSizeReplicationBlockSizeNamerwrrHngpyk119pyOB3128MB.successrwrrkangpykarvgpy1.74MB3128MBpartrOOOOO-rw-r-r-k11gpykangpy598.97KB3128MBIMrVrOOOoIHodoop.2014.图4.24.2 用户向量Stepl程序是,使用原始数据,用userID来作为Map的Key,用movield:rating作为value,发送到reducer端。Reducer端依据userid来做个汇总,values为movield:rating,moiveld:rating,moiveld:rating.在HDFS中数据是这样的:97318:4.5,32:4.5,3253:3.0,33004:3.5,34437:3.0,981721:5.0,122904:5.0,1261:4.0,149830:3.0,1527:5.0,9939:4.0,3910:5.0,3911:3.0,3967:4.0,4014:4.0,962248:3.0,2336:3.0,25868:4.0,25947:5.0,2692:3.0,9516:5,0,1644:3.0,1645:4.0,1655:2.0,1690:3.0,94527:5,0,1:4.0,1089:2.5,111:3.5,1131:4.5,1172:3.5第一列为用户向量,第二列为用户看过的历史电影记录里面的电影Id和对应的电影的评分4. 3共现矩阵Step2程序是创建商品的共现矩阵,Stepl处理完成的数据集,去掉userid,把用户购买历史里面的m。Vield两两匹配做为key,这里我们把两个物品id做个比较,较小的id位于第一列,较大的Id位于第二列,为了避免重复,1作为value,输出到reducer端,reducer端做汇总输出,出一个物品的共现矩阵。在HDFS中数据是这样子的:112818:1163972112818:1164132112818:1164192112818:1167972112818:1167992112818:1168232112818:1168492112818:1168872112818:1169772112818:1171072112818:1171232112818:1171762112818:1175112112818:1175292112818:1178952112818:1183262112818:1183542112818:1189002第一列为物品Id,第二列为物品Id,第三列为前两列物品在用户的观看历史记录里共同出现的次数,这个文件为商品贡献矩阵,第一列电影id是矩阵的列,第二列电影id为矩阵的行。4.4 用户矩阵乘以共现矩阵Step4程序是用户矩阵乘以商品的共现矩阵,最后以用户的用户Id和ItenllD,还有所有乘积的数据,在HDFS中数据是这样子的:99172,1318:9.099172,1317:8.099172,1323:6.099172,1356:12.099172,1398:13.599172,1419:10.04.5 按商品ID做累加Step5程序是按商品Id做一个累加,最后形成已用户Id,商品Id,推荐指数的文件在HDSF中数据是这样的:999,116397,46.0999,116396,23.0999,115011,12.0999,114234,12.0999,109835,56.0999,99344,99.0999,98333,13.0999,7600,10003.04.6 除去用户已经购买过商品Step6:程序是除去用户己经购买过的商品,剩下用户未购买的商品,用户的iD,用户未购买商品的商品ID,和对于该用户的该商品的推荐系数,去重的目的是为了,用户已经购买过得商品不做推荐4.7 验证Step7:是做验证用未训练过的数据集来验证我们的推荐,算法是,我们计算得出的推荐商品数目除以用户的未验证数据集的购买数量,最后计算得出每个用户预测准确率为百分之比,然后把百分比高的用户数据做推荐,详情见代码Step7Hdfs上数据集:20.03 0.54 1.05 0.56 0.0第一列为用户ID,第二列为推荐成功百分数;5.1数据集的介绍本论文采用GroupLens小组提供的MovieLens数据集合来评测该数据集是对外公开的,方便学习参考实验,网站提供了各种不同大小的数据集来供学习和研究。本次使用的是大小为IM的数据集,因为该小组推荐系统就是通过采用协同过滤推荐算法完成了电影推荐,所以,这个MovieLens数据集的可靠性很高,本数据集由,100000评级和1300标签应用到9000电影由700用户。最后更新10/2016,本数据集包含了:movies,dat,ratings,dat和USerS含at,其中ratings.dat就是用户商品评分文件,文件中依次表示的是:用户ID,商ID,用户对商品的评分,时间戳,如图5.1所示BCDuseridJjnovieIdratingtimestamp2312.51.26E+093:1102931.26E+0941106131.26E+0951112921.26E+0961117241.26E+09图5.15.2实验平台简介本论文是通过Hadoop平台运用HDFS分布式的方式对数据进行存储并且用MaPRedUCe处理的,HadOOP需要多个节点部署,对于每个节点要求不高,普通的商用pc机就可以用来搭建平台了。具体的实验软硬件环境如下:操作系统:CentOS6.0编程环境:ECliPSe开发语言:JaVa1.8Hadoop版本:2.6.0数据节点:5实验节点如下:192.168.0.212qs-stg_02master192.168.0.213qs-stg-03192.168.0.216qs-stg-06192.168.0.217qs-stg-07192.168.0.218qs-stg-08本集群的Master是192.168.0.212节点,其中运行着NmeNode和ResourceManager,192.168.0.213节点运行着SecondNameNode,192.168.0.216、192.168.0217、192.168.0.218是SaIVe角色,上面运行着DataNode和NoCIeManager等服务,主要节点之间做了SSh免密登录,附录Apackagebs;publicclassStepOextendsConfiguredimplementsToolstaticclassStepOMapperextendsMapper<LongWritab1e,Text,Text,Text>privatestaticTextk=newText();©Overrideprotectedvoidmap(LongWritab1ekey,Textvalue,Mapper<LongWritab1e,Text,Text,Text>.Contextcontext)throwsIOException,InterruptedExceptionStringstring-value.toString();k.set(string);context,write(k,newText(zzz,);)staticclassStepOReducerextendsReducer<Text,Text,Text,Text>(©Overrideprotectedvoidreduce(Textkey,Iterable<Text>values,Reducer<Text,Text,Text,Text>.Contextcontext)throwsIOException,InterruptedExceptioncontext,write(key,newText(,z,z);)staticclassStepOPartitionerextendsPartitioner<Text,Text>©OverridepublicintgetPartition(Textkey,Textvalue,intnumPartitions)(Randomrandom=newRandom();intnum=random,nextInt(4);returnnum<3?0:1;/return(key.hashCode()&Integer.MAXVALUE)%numPartitions;)©Overridepublicintrun(Stringargs)throwsExceptionSystem.SetProperty(,ZHADOOP_USER_NAME/Z,“kangpy");Configurationconfiguration-getConfO;Stringinputstr-,zhdfs:/192.168.O.212:38301kangSoUrCedata/ratings,csv”;Stringoutputstr二,zhdfs:/192.168.O.212:38301/kang/0z,;/Pathinput=newPath(configuration,get(z,inputzz);/Pathoutput=newPath(configuration,get(zzoutputzz);Pathinput=newPath(inputstr);Pathoutput=newPath(outputstr);Jobjob-Job.getlnstance(configuration);job.SetJarByClass(this.getClass();job.SetJobName(zzkangyp,z);job.SetMapperClass(StepOMapper.class);job.setMapOutputKeyClass(Text,class);job.setMapOutputValueClass(Text,class);job.SetReducerClass(StepOReciucer.class);job.setOutputKeyClass(Text,class);job.setOutputValueClass(Text,class);job.SetlnputFormatClass(TextInputFormat.class);job.SetoutputFormatClass(TextOutputFormat.class);job.SetPartitionerClass(StepOPartitioner.class);job.SetNumReduceTasks(2);TextInputFormat.addlnputPath(job,input);TextOutputFormat.SetOutputPath(job,output);returnjob.WaitForCompletion(true)?0:1;publicstaticvoidmain(Stringargs)throwsExceptionSystem,exit(ToolRunner.run(newStepOO,args);附录Bpackagebs;publicclassSteplextendsConfiguredimplementsToolstaticclassSteplMapperextendsMapper<LongWritable,Text,Text,Text>(privatefinalstaticTextk=newText();privatefinalstaticTextv=newTextO;©Overrideprotectedvoidmap(LongWritab1ekey,Textvalue,Mapper<LongWritable,Text,Text,Text>.Contextcontext)throwsIOException,InterruptedException*1,101,5.0*/Stringstrings-value.toString().splitC,z);StringuserID=strings0.trim();StringitemID=stringslLtrim();Stringpre=strings2Ltrim();k.set(userID);v.set(itemID+,z:,z+pre);context,write(k,v);)staticclassSteplReducerextendsReducer<Text,Text,Text,Text>privatefinalstaticTextv=newText();©Overrideprotectedvoidreduce(Textkey,Iterable<Text>values,Reducer<Text,Text,Text,Text>.Contextcontext)throwsIOException,InterrupteclExceptionStringBuilderbuilder=newStringBuiIder();for(Iterator<Text>iterator二values,iterator();iterator.hasNext();)Textvalue=iterator,nextO;builder,append(value.toString()+,);)Stringstring=builder,substring(O,builder,length()-1);v.set(string);context,write(key,v);©Overridepublicintrun(Stringargs)throwsExceptionSystem.SetProperty(Z,HADOOP_USER_NAMEZ/,kangpy);Configurationconfiguration=getConfO;/Pathinput-newPath(configuration,get(,zinput,z);/Pathoutput=newPath(configuration,get(,outputz,);Stringinputstr二,hdfs:/192.168.O.212:38301kang