版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Hadoop的SlopeOne算法及其改进:原理、实现与应用探索一、引言1.1研究背景与意义在信息爆炸的时代,互联网上的数据量呈指数级增长。面对海量的信息,用户往往难以快速准确地找到自己真正感兴趣的内容。推荐系统应运而生,它作为解决信息过载问题的有效工具,已广泛应用于电子商务、社交媒体、在线视频、音乐平台等众多领域。例如,在电子商务平台中,推荐系统能够根据用户的历史购买记录、浏览行为等数据,为用户推荐可能感兴趣的商品,提高用户的购物效率和满意度,同时也能增加商家的销售额。据统计,亚马逊约35%的销售额来自于推荐系统的贡献,Netflix80%的用户观看内容是由推荐系统推荐的。协同过滤算法是推荐系统中应用最为广泛的算法之一,它主要基于用户之间的相似性或物品之间的相似性来进行推荐。SlopeOne算法作为一种简单而有效的协同过滤算法,在基于物品的协同过滤推荐中占据重要地位。该算法的核心思想是通过计算不同物品之间的平均差值,来预测用户对某个物品的评分,具有算法简单、易于实现、执行效率较高等优点,尤其在数据稀疏的情况下也能取得较好的推荐效果。然而,随着互联网用户数量的不断增加以及数据量的持续增长,传统的单机版SlopeOne算法在处理大规模数据时面临着计算速度慢、内存不足等问题。Hadoop作为一个开源的分布式计算框架,具有高可靠性、高扩展性和高容错性等特点,能够同时处理大量数据。将SlopeOne算法基于Hadoop框架来实现,可以充分利用Hadoop的分布式计算能力,提高算法的计算速度和扩展性,使其适用于大规模数据的处理场景。此外,学术界和工业界对SlopeOne算法进行了不断的研究和改进,提出了多种改进算法,如有偏评分的处理、基于时间戳的加权预测等。这些改进算法在实际应用中显示出了更高的准确性和效率。因此,研究基于Hadoop的SlopeOne及其改进算法实现,对于提升推荐系统在大规模数据环境下的性能和效果具有重要的理论和实践意义。1.2研究目标与内容本研究的主要目标是基于Hadoop框架实现SlopeOne算法及其改进算法,并将其应用于推荐系统中,通过实验评估来探究这些算法在推荐系统中的性能和效果,为推荐系统算法的发展提供参考和借鉴。具体研究内容如下:深入剖析SlopeOne算法:全面分析SlopeOne算法的原理、详细的实现过程,深入了解其在实际应用中的优点和存在的不足,为后续的算法改进和优化提供理论基础。基于Hadoop实现SlopeOne算法:利用Hadoop的分布式计算特性,将SlopeOne算法从单机实现迁移到Hadoop平台上。构建合适的输入格式,实现Mapper和Reducer函数,通过不断测试和调优,解决大规模数据处理过程中遇到的问题,提高算法的计算效率和扩展性。探究并实现SlopeOne改进算法:研究多种SlopeOne算法的改进思路,如有偏评分的处理、基于时间戳的加权预测等改进算法,并在Hadoop平台上实现这些改进算法。通过实验对比,分析不同改进算法的性能和效果差异。构建推荐系统模型并评估算法效果:基于实现的SlopeOne算法及其改进算法,构建完整的推荐系统模型。利用已有的公开数据集,如Movielens、Book-Crossing等,对不同算法进行训练和测试。运用多种评估指标,如准确率、召回率、F1值、均方根误差(RMSE)等,对不同算法在推荐系统中的性能和效果进行全面评估,探究算法的应用价值。1.3研究方法与技术路线理论研究:广泛查阅国内外相关文献资料,对SlopeOne算法及其改进算法进行深入的理论研究。了解这些算法的原理、优缺点、应用场景以及当前的研究现状和发展趋势,为后续的算法实现和改进提供坚实的理论依据。技术选型:根据研究需求和目标,选择合适的开发语言和工具。考虑到Hadoop生态系统主要基于Java语言开发,且Java具有良好的跨平台性和丰富的类库支持,因此选择Java作为主要开发语言。同时,选用Hadoop作为分布式计算框架,利用其MapReduce编程模型来实现SlopeOne算法及其改进算法。数据采集:采集或利用已有的公开数据集,如Movielens、Book-Crossing等。这些数据集包含了丰富的用户行为数据和物品信息,能够满足模型训练和测试的需求。数据处理:对采集到的数据进行清洗、去噪、归一化等预处理操作。去除数据中的噪声和异常值,对评分数据进行归一化处理,使其处于相同的数值范围内,以保证模型的准确性和可靠性。模型构建:基于Hadoop的MapReduce编程模型,实现SlopeOne算法及其改进算法,并构建完整的推荐系统模型。在构建过程中,合理设计数据结构和算法流程,充分发挥Hadoop的分布式计算优势,提高算法的执行效率。实验评估:利用评估指标对不同算法在推荐系统中的性能和效果进行评估。通过对比实验,分析不同算法在准确率、召回率、F1值、均方根误差(RMSE)等指标上的表现,探究算法的应用价值和适用场景。具体技术路线如图1-1所示:[此处插入技术路线图]1.4创新点与预期成果本研究的创新点主要体现在以下几个方面:实现高效分布式推荐系统:通过将SlopeOne算法及其改进算法基于Hadoop框架实现,构建了一个高效的分布式推荐系统。该系统能够自动处理海量数据,充分利用集群的计算资源,实现并行计算,大大提高了推荐系统的计算速度和扩展性,能够产生高质量的推荐结果。改进算法提高准确性和应用范围:对SlopeOne算法进行深入研究和改进,引入有偏评分处理、基于时间戳的加权预测等改进策略,提高了算法的准确性和应用范围。使得推荐系统能够更好地适应不同的应用场景和用户需求,为用户提供更加个性化、精准的推荐服务。借助Hadoop处理庞大的数据规模:借助Hadoop框架强大的分布式存储和计算能力,能够处理更加庞大的数据规模。同时,实现了在线学习和增量式学习功能,使得推荐系统能够实时更新用户的行为数据和推荐模型,及时反映用户的兴趣变化,提高推荐的实时性和有效性。本研究的预期成果如下:基于Hadoop实现算法并应用于推荐系统:成功基于Hadoop框架实现SlopeOne算法及其改进算法,解决大规模数据处理的问题,并将其在推荐系统中得到实际应用,提高推荐系统的性能和效果。探究算法效果和性能指标:通过实验对比,深入探究多种SlopeOne算法的效果和性能指标,为推荐系统算法的发展提供有价值的参考和借鉴,推动推荐系统领域的技术进步。提高大数据处理效率和准确性:提高大数据处理的效率和准确性,为数据挖掘和机器学习领域的研究提供一定的支持,促进相关领域的交叉融合和发展。探索Hadoop在推荐系统中的应用:探索Hadoop框架在推荐系统中的应用模式和方法,为分布式计算技术在实际应用中的发展提供一定的参考和借鉴,拓展Hadoop的应用领域。二、相关理论基础2.1Hadoop平台概述2.1.1Hadoop的架构与核心组件Hadoop是一个开源的分布式计算框架,主要用于处理大规模数据集。其核心设计理念是将大规模数据集分割成多个小数据块,分布存储在由廉价商用硬件组成的集群节点上,并通过分布式计算框架对这些数据进行并行处理。Hadoop主要包含以下几个核心组件:Hadoop分布式文件系统(HDFS):这是Hadoop的存储基础,它能够在普通硬件上构建高容错性的分布式文件系统。HDFS将文件分割成多个数据块,并在集群中的多个节点上进行冗余存储,以确保数据的可靠性和可用性。例如,一个大文件可能被分割成128MB或256MB的数据块,分别存储在不同的节点上,即使部分节点出现故障,数据仍然可以通过其他副本进行恢复。HDFS采用主从架构,由NameNode和DataNode组成。NameNode负责管理文件系统的命名空间,存储文件的元数据信息,如文件的权限、所有者、大小、修改时间等,以及文件到数据块的映射关系。DataNode负责实际存储数据块,定期向NameNode汇报自己存储的数据块信息。MapReduce:这是Hadoop的分布式计算模型,用于大规模数据集的并行处理。MapReduce任务分为两个阶段:Map阶段和Reduce阶段。在Map阶段,数据被分割后分配到各个节点上进行处理,每个节点根据自定义的映射函数将输入数据转换为键值对形式;在Reduce阶段,具有相同键的值会被合并在一起,并通过自定义的归约函数进行最终的计算和处理,得到所需的结果。这种计算模型能够充分利用集群的计算资源,大大提高数据处理的效率。例如,在进行大规模文本数据的词频统计时,Map阶段可以将文本数据分割成多个小块,每个节点对自己负责的小块数据进行单词提取,并将每个单词作为键,出现次数1作为值输出;Reduce阶段将所有相同单词的键值对汇聚到一起,对值进行累加,从而得到每个单词在整个文本中的出现次数。YARN(YetAnotherResourceNegotiator):作为Hadoop的资源管理层,负责集群资源(内存、CPU、带宽等)的统一管理与调度。它采用主从架构,由ResourceManager和NodeManager组成。ResourceManager是Yarn集群的唯一主节点,全局管理所有资源,协调各个应用程序对资源的请求,包含调度器和应用管理器两个关键模块。调度器根据资源分配策略(如容量调度、公平调度)为应用程序分配资源,不负责监控任务状态;应用管理器管理所有应用程序的生命周期,包括应用程序提交、失败重试等。NodeManager运行在集群每个节点上,负责管理本节点的资源,监控容器状态,并与ResourceManager通信汇报节点健康情况。Container是Yarn中资源分配的最小单位,封装了一组具体资源(如2GB内存+1个CPU核心),类似于轻量级虚拟机,每个Container归属于特定应用程序,资源隔离性强,支持动态扩展,根据任务需求调整资源配置。每个应用程序都有一个专属的ApplicationMaster,负责与ResourceManager协商资源、与NodeManager交互启动任务,并监控作业进度。HadoopCommon:包含支持其他Hadoop模块所需的实用程序和库,为Hadoop的其他组件提供了基础的支持和服务,如文件系统操作、配置管理、RPC(远程过程调用)框架等。例如,它提供了对不同文件系统的抽象接口,使得Hadoop能够方便地操作本地文件系统、HDFS以及其他兼容的分布式文件系统。2.1.2Hadoop在大数据处理中的优势高可靠性:Hadoop通过数据冗余存储和自动故障检测与恢复机制,确保了数据在面对硬件故障或其他异常情况时的可靠性。在HDFS中,每个数据块会在多个节点上保存副本,当某个节点出现故障时,系统可以自动从其他拥有副本的节点获取数据,保证数据不会丢失。同时,MapReduce任务在执行过程中,如果某个节点上的任务失败,系统会自动将该任务重新分配到其他可用节点上执行,确保整个计算任务的顺利完成。高扩展性:Hadoop集群可以方便地通过添加新的节点来扩展其存储和计算能力。随着数据量的增长和处理需求的增加,只需简单地增加硬件资源,无需对整个系统架构进行大规模修改,就能轻松应对。这种横向扩展的能力使得Hadoop能够适应不断变化的业务需求,为企业提供了极大的灵活性。例如,当企业的数据量从TB级增长到PB级时,可以通过添加更多的节点到Hadoop集群中,让集群的存储和计算能力随之线性扩展。高效性:Hadoop能够在大规模集群上并行处理数据,充分利用集群的计算资源,显著提高数据处理速度。MapReduce编程模型将大规模的数据处理任务分解为多个小任务,分配到集群中的不同节点上同时进行处理,最后再将各个节点的处理结果进行汇总。与传统的单机处理方式相比,Hadoop能够在更短的时间内完成复杂的数据处理任务,如海量日志分析、数据挖掘等。例如,在处理电商平台的海量用户行为日志数据时,使用Hadoop可以在短时间内完成数据的清洗、分析和挖掘,为企业的决策提供及时的数据支持。低成本:Hadoop基于廉价的商用硬件构建分布式系统,相比传统的大型机或高端存储设备,大大降低了硬件成本。企业可以使用普通的PC服务器来搭建Hadoop集群,实现大规模数据的存储和处理,而无需投入大量资金购买昂贵的硬件设备。此外,Hadoop是开源软件,用户可以免费使用和定制,进一步降低了软件成本。这使得企业和组织能够以较低的成本构建大规模的数据处理平台,处理海量数据。支持多种数据格式:Hadoop支持多种数据格式,包括结构化、半结构化和非结构化数据。这使得用户可以灵活处理各种类型的数据,无论是关系型数据库中的表格数据,还是XML、JSON等半结构化数据,亦或是文本文件、图像、音频、视频等非结构化数据,Hadoop都能有效地进行存储和处理。例如,在处理社交媒体数据时,其中包含了大量的文本、图片、视频等非结构化数据,以及用户信息、点赞评论等结构化数据,Hadoop可以将这些不同格式的数据统一存储和处理,为数据分析提供全面的数据支持。丰富的生态系统:Hadoop拥有庞大的开源社区和丰富的生态系统,包含HBase、Hive、Pig、Spark等众多工具和框架,可以支持不同的数据存储和处理需求。HBase是一个分布式的、面向列的非关系型数据库,适用于海量结构化数据的实时读写;Hive提供了一种类似SQL的查询语言HiveQL,方便用户进行数据仓库的构建和数据分析;Pig是一种数据流语言和运行环境,用于检索、过滤和分析大型数据集;Spark是一个快速、通用、可扩展的大数据处理引擎,提供了内存计算的能力,可以大幅度提高数据处理速度,并且支持批处理、流处理、交互式查询和机器学习等多种计算模式。这些工具和框架相互配合,大大拓展了Hadoop的功能,使其应用场景更加多样化。2.2SlopeOne算法原理2.2.1SlopeOne算法基本思想SlopeOne算法是一种基于评分的协同过滤算法,其基本思想非常简单,基于所谓的“热门度差异”,也就是用户对物品的评分差值。该算法假设两个物品之间的评分满足线性关系y=x+b,通过对这两个物品都评过分的用户的评分数据拟合该线性函数,获得参数b的估计值,从而估计目标物品的评分。例如,假设有多个用户对物品A和物品B进行了评分,用户1对物品A评分为4分,对物品B评分为6分;用户2对物品A评分为3分,对物品B评分为5分。那么物品B相对于物品A的平均偏差为((6-4)+(5-3))/2=2。当有新用户对物品A评分为5分,要预测该用户对物品B的评分时,就可以根据这个平均偏差进行预测,预测评分为5+2=7分。SlopeOne算法试图同时满足易于实现和维护、运行时可更新、高效率的查询响应、对初次访问者要求少以及合理的准确性这5个目标。它不需要计算物品之间的相似度,而是直接利用用户对物品的评分差值来进行预测,这使得算法简单易懂,易于实现和维护。而且,当有新的评分数据加入时,算法能够即时更新预测结果,具有较好的实时性。同时,由于算法的计算过程相对简单,查询响应速度较快,即使对于评分项目很少的新用户,也能获得有效的推荐。虽然其准确性可能略逊于一些复杂的算法,但在简单性和扩展性方面具有明显优势。2.2.2算法流程与数学模型数据准备:首先需要收集用户对物品的评分数据,通常以用户-物品评分矩阵的形式表示。假设共有m个用户和n个物品,评分矩阵R是一个m\timesn的矩阵,其中R_{ij}表示用户i对物品j的评分,如果用户i未对物品j评分,则R_{ij}为缺失值。计算物品之间的平均偏差:对于任意两个物品i和j,计算它们之间的平均偏差dev_{j,i}。定义S_{j,i}为同时对物品i和j打分的用户集合,\vertS_{j,i}\vert表示集合S_{j,i}中的用户数量。则平均偏差dev_{j,i}的计算公式为:dev_{j,i}=\frac{\sum_{u\inS_{j,i}}(R_{uj}-R_{ui})}{\vertS_{j,i}\vert}其中,R_{uj}表示用户u对物品j的评分,R_{ui}表示用户u对物品i的评分。这个公式的含义是,将同时对物品i和j评分的用户对这两个物品的评分差值进行累加,然后除以评分用户的数量,得到物品j相对于物品i的平均偏差。预测用户对未评分物品的评分:对于目标用户u和未评分物品j,根据目标用户对已评分物品的评分以及物品之间的平均偏差来预测用户u对物品j的评分P_{uj}。假设用户u已经对物品集合I中的物品进行了评分,则预测评分的计算公式为:P_{uj}=\frac{\sum_{i\inI}(\vertS_{j,i}\vert\times(R_{ui}+dev_{j,i}))}{\sum_{i\inI}\vertS_{j,i}\vert}这个公式的计算过程是,对于用户u已评分的每个物品i,先将用户u对物品i的评分R_{ui}加上物品j相对于物品i的平均偏差dev_{j,i},然后乘以同时对物品i和j评分的用户数量\vertS_{j,i}\vert,将所有这些结果进行累加作为分子;分母则是将所有已评分物品i对应的\vertS_{j,i}\vert进行累加。最后将分子除以分母,得到预测评分P_{uj}。2.2.3实例分析以电影评分数据为例,假设有如下用户-电影评分数据:用户ID电影A电影B电影C1532234-3-25计算物品之间的平均偏差:计算电影B相对于电影A的平均偏差dev_{B,A}:同时对电影A和电影B评分的用户是用户1和用户2。对于用户1,评分差值为3-5=-2;对于用户2,评分差值为4-3=1。则dev_{B,A}=\frac{(-2+1)}{2}=-\frac{1}{2}。计算电影C相对于电影A的平均偏差dev_{C,A}:同时对电影A和电影C评分的用户是用户1。评分差值为2-5=-3,因为只有一个用户评分,所以dev_{C,A}=-3。计算电影C相对于电影B的平均偏差dev_{C,B}:同时对电影B和电影C评分的用户是用户1和用户3。对于用户1,评分差值为2-3=-1;对于用户3,评分差值为5-2=3。则dev_{C,B}=\frac{(-1+3)}{2}=1。预测用户2对电影C的评分:用户2对电影A评分为3分,对电影B评分为4分。根据公式P_{2C}=\frac{\vertS_{C,A}\vert\times(R_{2A}+dev_{C,A})+\vertS_{C,B}\vert\times(R_{2B}+dev_{C,B})}{\vertS_{C,A}\vert+\vertS_{C,B}\vert}。这里\vertS_{C,A}\vert=1(只有用户1同时对电影A和电影C评分),\vertS_{C,B}\vert=2(用户1和用户3同时对电影B和电影C评分),R_{2A}=3,dev_{C,A}=-3,R_{2B}=4,dev_{C,B}=1。代入公式可得:P_{2C}=\frac{1\times(3-3)+2\times(4+1)}{1+2}=\frac{0+10}{3}=\frac{10}{3}\approx3.33所以预测用户2对电影C的评分为3.33分。通过这个实例可以清晰地看到SlopeOne算法从数据处理到评分预测的完整过程。2.3SlopeOne改进算法介绍2.3.1SlopeOnewithBiases算法SlopeOnewithBiases算法是在原SlopeOne算法的基础上加入了用户评分偏差计算,以提高预测准确性。原SlopeOne算法假设所有用户的评分标准是一致的,但在实际情况中,不同用户的评分习惯存在差异,有些用户评分普遍偏高,有些用户评分普遍偏低。SlopeOnewithBiases算法引入了用户偏差和物品偏差的概念。计算用户偏差和物品偏差:对于每个用户u,计算其用户偏差b_u。首先计算用户u对所有已评分物品的平均评分\overline{R}_u,然后用户偏差b_u=\overline{R}_u-\overline{R},其中\overline{R}是所有用户对所有物品的平均评分。对于每个物品i,计算其物品偏差b_i。先计算物品i被所有用户评分的平均值\overline{R}_i,物品偏差b_i=\overline{R}_i-\overline{R}。预测评分公式改进:在预测用户u对物品j的评分时,公式变为:P_{uj}=b_u+b_j+\frac{\sum_{i\inI}(\vertS_{j,i}\vert\times(R_{ui}+dev_{j,i}))}{\sum_{i\inI}\vertS_{j,i}\vert}其中,b_u和b_j分别表示用户u和物品j的偏差。通过加入用户偏差和物品偏差,可以更好地考虑用户和物品本身的特性对评分的影响,从而提高预测的准确性。例如,对于一个评分普遍偏高的用户,其用户偏差b_u为正值,在预测其对其他物品的评分时,会适当提高预测评分;对于一个被普遍评价较高的物品,其物品偏差b_j为正值,也会对预测评分产生相应的影响。2.3.2WeightedSlopeOne算法WeightedSlopeOne算法是对评分差值进行加权处理,考虑不同评分对预测结果的影响。在原SlopeOne算法计算物品之间的平均偏差时,没有考虑到不同的用户数量对平均偏差计算的影响。例如,一万个用户都给了物品j和i进行打分,而只有1个用户对物品j和m进行打分,那么最终计算得到的dev\##ä¸ãåºäºHadoopçSlopeOneç®æ³å®ç°\##\#3.1ç¯å¢æå»ºä¸ææ¯éå\##\##3.1.1Hadoopé群æå»ºæ¬ç
ç©¶éç¨ä¸å°èææºæ¥æå»ºHadoopé群ï¼åå«ä½ä¸ºNameNodeãDataNodeåResourceManagerãNodeManagerèç¹ãå¨æå»ºè¿ç¨ä¸ï¼éè¿è¡å¤æ¹é¢çé ç½®ã-**æä½ç³»ç»é ç½®**ï¼ä»¥CentOS7.9为ä¾ï¼é¦å å ³éé²ç«å¢ä¸SELinuxï¼æ§è¡å½ä»¤âsystemctlstopfirewalldâåâsystemctldisablefirewalldâæ¥å ³éé²ç«å¢ï¼éè¿âsed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/configâåâsetenforce0âæ¥ç¦ç¨SELinuxãç¶å忥èç¹æ¶é´ï¼å®è£ ntpæå¡ï¼æ§è¡âyuminstall-yntpâï¼å¯å¨å¹¶è®¾ç½®å¼æºèªå¯ntpdæå¡ï¼å³âsystemctlstartntpdâåâsystemctlenablentpdâï¼åéè¿ântpdateâ䏿¶é´æå¡å¨åæ¥æ¶é´ãæ¥çé 置主æºåä¸hostsè§£æï¼å¨åèç¹ä¸ä½¿ç¨âhostnamectlset-hostname[主æºå]âä¿®æ¹ä¸»æºåï¼ä¾å¦å°ä¸å°ä¸»æºå设置为âhadoop-masterâï¼å¹¶å¨/etc/hostsæä»¶ä¸æ·»å
åèç¹çIPå°åå主æºåæ
å°ï¼å¦â0hadoop-masterââ1hadoop-slave1ââ2hadoop-slave2âã-**JDKå®è£ **ï¼Hadoop3.xè¦æ±Java8ææ´é«çæ¬ï¼å¨ææèç¹ä¸è¿è¡JDKå®è£ ãé¦å ä¸è½½JDKå®è£ å ï¼å¦âwget/java/8/archive/jdk-8u301-linux-x64.tar.gzâï¼ç¶åè§£åå°æå®ç®å½âtar-zxvfjdk-8u301-linux-x64.tar.gz-C/usr/local/âãæ¥çé ç½®ç¯å¢åéï¼å¨/etc/profileæä»¶ä¸æ·»å
âexportJAVA_HOME=/usr/local/jdk1.8.0_301âåâexportPATH=$JAVA_HOME/bin:$PATHâï¼ä½¿ç¯å¢åéçææ§è¡âsource/etc/profileâãæåéè¿âjava-versionâå½ä»¤éªè¯å®è£ æ¯å¦æåï¼è¥è¾åºçæ¬ä¿¡æ¯âjdk1.8.0_301âå表示å®è£ æåã-**SSHå å¯ç»å½é ç½®**ï¼å¨Masterèç¹ä¸çæå¯é¥å¯¹ï¼æ§è¡âssh-keygen-trsa-P""-f~/.ssh/id_rsaâï¼ä¸è·¯å车å³å¯ãç¶åå°å ¬é¥å¤å¶å°å ¶ä»èç¹ï¼å æ¬èªèº«ï¼ï¼æ§è¡âssh-copy-id[ç®æ
èç¹ç¨æ·å]@[ç®æ
èç¹IPå°å]âï¼å¦âssh-copy-idroot@hadoop-slave1ââssh-copy-idroot@hadoop-slave2ââssh-copy-idroot@hadoop-masterâï¼è¾å ¥å¯¹åºèç¹çå¯ç
宿å å¯ç»å½é ç½®ã-**Hadoopå®è£ ä¸é ç½®**ï¼ä¸è½½Hadoopå®è£ å ï¼è§£ååç§»å¨å°æå®æä»¶å¤¹ï¼å¦âtar-zxvfhadoop-3.3.6.tar.gz-C/usr/local/â并尿件夹éå½å为âhadoopâãé ç½®ç¯å¢åéï¼å¨/etc/profileæä»¶ä¸æ·»å
âHADOOP_HOME=/usr/local/hadoopââexportPATH=$PATH:$HADOOP_HOME/binââexportPATH=$PATH:$HADOOP_HOME/sbinâï¼æ§è¡âsource/etc/profileâ使ç¯å¢åéçæãæ¥ä¸æ¥ä¿®æ¹Hadoopçé ç½®æä»¶ï¼å¨hadoop-env.shåyarn-env.shæä»¶ä¸ä¿®æ¹âexportJAVA_HOME=/usr/local/jdk1.8.0_301âæå®JDKè·¯å¾ãå¨core-site.xmlæä»¶ä¸é ç½®âfs.defaultFSâ为âHDFSçURIï¼å¦hdfs://hadoop-master:9000âï¼ä»¥åâhadoop.tmp.dirâ为âHadoopè¿è¡æ¶äº§çæä»¶çåå¨ç®å½ï¼å¦/usr/hadoop/tmpâãå¨hdfs-site.xmlæä»¶ä¸è®¾ç½®â.dirâ为âNameNodeä¸åå¨HDFSåå空é´å æ°æ®çç®å½ï¼å¦/usr/hadoop/hdfs/nameâï¼âdfs.data.dirâ为âDataNode䏿°æ®åçç©çåå¨ä½ç½®ï¼å¦/usr/hadoop/hdfs/dataâï¼å¹¶è®¾ç½®âdfs.replicationâä¸ºå¯æ¬æ°éï¼é常设置为3ãå¨mapred-site.xmlæä»¶ä¸ä¿®æ¹ââ为âyarnâãå¨yarn-site.xmlæä»¶ä¸é ç½®âyarn.nodemanager.aux-servicesâ为âmapreduce_shuffleâï¼âyarn.resourcemanager.hostnameâ为ResourceManageræå¨èç¹ç主æºåï¼å¦âhadoop-masterâãé ç½®å®æåï¼å¨åèç¹å建é ç½®æä»¶ä¸æå®çæä»¶å¤¹ï¼å¦âmkdir-p/usr/hadoop/tmpââmkdir/usr/hadoop/hdfsââmkdir/usr/hadoop/hdfs/dataââmkdir/usr/hadoop/hdfs/nameâãæåå¨ä½¿ç¨Hadoopä¹åï¼éè¦å¯¹NameNodeè¿è¡æ
¼å¼åï¼æ§è¡âhadoopnamenode-formatâã宿ä¸è¿°é ç½®åï¼å¨/hadoop/sbinè·¯å¾ä¸æ§è¡âstart-dfs.shâå¯å¨HDFSï¼æ§è¡âstart-yarn.shâå¯å¨YARNãéè¿âjpsâå½ä»¤éªè¯å¯å¨æ¯å¦æåï¼è¥åºç°âNameNodeââDataNodeââResourceManagerââNodeManagerâçè¿ç¨å表示å¯å¨æåã\##\##3.1.2å¼åå·¥å ·ä¸ç¼ç¨è¯è¨éæ©-**ç¼ç¨è¯è¨éæ©Java**ï¼æ¬ç
ç©¶éæ©Javaä½ä¸ºä¸»è¦ç¼ç¨è¯è¨ï¼ä¸»è¦åºäºä»¥ä¸åå
ãé¦å ï¼Hadoopçæç³»ç»ä¸»è¦æ¯åºäºJavaè¯è¨å¼åçï¼Javaä¸Hadoopçå ¼å®¹æ§æä½³ã使ç¨Javaè¿è¡å¼åï¼å¯ä»¥æ¹ä¾¿å°è°ç¨Hadoopæä¾çåç§APIï¼ä¾å¦HDFSçæä»¶æä½APIãMapReduceçç¼ç¨APIçï¼è½å¤æ´é«æå°å®ç°åºäºHadoopçSlopeOneç®æ³ãå ¶æ¬¡ï¼Javaå ·æè¯å¥½çè·¨å¹³å°æ§ï¼ç¼åç代ç
å¯ä»¥å¨ä¸åçæä½ç³»ç»ä¸è¿è¡ï¼æ
论æ¯WindowsãLinuxè¿æ¯MacOSï¼è¿ä¸ºç®æ³çé¨ç½²ååºç¨æä¾äºæå¤§ççµæ´»æ§ãæ¤å¤ï¼Javaæ¥æä¸°å¯çç±»åºï¼æ¶µçäºæ°æ®ç»æãç®æ³ãç½ç»éä¿¡ãæä»¶å¤ççå¤ä¸ªæ¹é¢ãå¨å®ç°SlopeOneç®æ³è¿ç¨ä¸ï¼å¯ä»¥å©ç¨Javaçéåç±»ï¼å¦HashMapãArrayListçï¼æ¥åå¨åå¤çæ°æ®ï¼å©ç¨å¤çº¿ç¨ç±»æ¥å®ç°å¹¶åæä½ï¼ä»èæé«ç®æ³çæ§è½åæçãåæ¶ï¼Javaçå®å ¨æ§åç¨³å®æ§ä¹ä½¿å¾å¼åçç¨åºæ´å
å¯é
ï¼è½å¤æ»¡è¶³å¤§è§æ¨¡æ°æ®å¤ççéæ±ã-**å¼åå·¥å ·éæ©Eclipse**ï¼éæ©Eclipseä½ä¸ºå¼åå·¥å ·ï¼å®æ¯ä¸ä¸ªå¼æºçãåè½å¼ºå¤§çéæå¼åç¯å¢ï¼IDEï¼ãEclipseå ·æä¸°å¯çæä»¶èµæºï¼éè¿å®è£ Mavenæä»¶ï¼å¯ä»¥æ¹ä¾¿å°ç®¡ç项ç®çä¾èµå ³ç³»ãå¨å¼ååºäºHadoopçSlopeOneç®æ³é¡¹ç®æ¶ï¼é¡¹ç®å¯è½ä¾èµäºHadoopç¸å ³çåºãæ¥å¿å¤çåºçï¼ä½¿ç¨Mavenå¯ä»¥è½»æ¾å°ä¸è½½å管çè¿äºä¾èµï¼é¿å äºæå¨ä¸è½½åé ç½®åºæä»¶çç¹çè¿ç¨ãEclipseæä¾äºå¼ºå¤§ç代ç
ç¼è¾åè½ï¼å¦ä»£ç
èªå¨è¡¥å ¨ãè¯æ³é«äº®ã代ç
æ
¼å¼åçï¼è½å¤æé«å¼åæçãå¨è°è¯æ¹é¢ï¼Eclipseå ·å¤ç´è§çè°è¯çé¢ï¼å¯ä»¥è®¾ç½®æç¹ã忥æ§è¡ãæ¥çåéå¼çï¼æ¹ä¾¿å¼å人åå¿«éå®ä½åè§£å³ä»£ç
ä¸çé®é¢ãèä¸ï¼Eclipse对Java项ç®çæ¯æé常å®åï¼è½å¤å¾å¥½å°ä¸Javaå¼åç»åï¼æ»¡è¶³æ¬ç
ç©¶åºäºJavaå¼åçéæ±ãåæ¶ï¼Eclipseæ¥æåºå¤§çç¨æ·ç¤¾åºï¼å½å¼åè¿ç¨ä¸éå°é®é¢æ¶ï¼å¯ä»¥å¨ç¤¾åºä¸æç´¢è§£å³æ¹æ¡ï¼æè åå ¶ä»å¼åè 请æï¼è·å帮å©ã\##\#3.2æ°æ®é¢å¤ç\##\##3.2.1æ°æ®ééä¸è·åæ¬ç
ç©¶çæ°æ®æ¥æºä¸»è¦æä¸¤ä¸ªæ¹é¢ï¼å ¬å¼æ°æ®éåå®é ä¸å¡ç³»ç»æ°æ®ãå ¬å¼æ°æ®ééç¨MovielensåBook-Crossingæ°æ®éãMovielensæ°æ®éæ¯ä¸ä¸ªå¹¿æ³åºç¨äºæ¨èç³»ç»ç
ç©¶ççµå½±è¯åæ°æ®éï¼å®å å«äºå¤§éç¨æ·å¯¹çµå½±çè¯åæ°æ®ãç¨æ·ä¿¡æ¯ä»¥åçµå½±ä¿¡æ¯ãå¯ä»¥ä»å ¶å®æ¹ç½ç«ï¼/datasets/movielens/ï¼ä¸ä¸è½½ä¸åè§æ¨¡çæ°æ®éçæ¬ï¼å¦ml-100kãml-1mãml-20mçï¼æ¬ç
ç©¶éç¨ml-1mçæ¬ï¼è¯¥çæ¬å å«çº¦100䏿¡è¯åè®°å½ï¼6000å¤ä¸ªç¨æ·å¯¹4000å¤é¨çµå½±çè¯åï¼è½å¤æ»¡è¶³ç®æ³è®ç»åæµè¯çéæ±ãBook-Crossingæ°æ®éåå å«äºå¾ä¹¦é¢åçç¨æ·è¯åæ°æ®ï¼ç¨æ·å¯ä»¥å¨è¯¥æ°æ®é䏿¾å°ç¨æ·å¯¹ä¸å书ç±çè¯åãç¨æ·çåºæ¬ä¿¡æ¯ä»¥å书ç±çç¸å ³æè¿°çãå¯ä»å ¶å®æ¹ç½ç«ï¼rmatik.uni-fridericiana.de/~cziegler/BX/ï¼è·åãä»å®é ä¸å¡ç³»ç»ä¸ééæ°æ®æ¶ï¼å¯¹äºçµåä¸å¡ç³»ç»ï¼éè¿æ°æ®åºè¿æ¥å·¥å ·ï¼å©ç¨SQLæ¥è¯¢è¯å¥ä»ä¸å¡æ°æ®åºä¸æåç¨æ·çè´ä¹°è®°å½ãæµè§è®°å½ãæ¶èè®°å½çæ°æ®ãä¾å¦ï¼ä»MySQLæ°æ®åºä¸æ¥è¯¢ç¨æ·è¡¨ã订å表ãåå表çç¸å ³è¡¨ï¼éè¿å ³èæ¥è¯¢è·åç¨æ·IDãååIDãè´ä¹°æ¶é´ãè´ä¹°æ°éãè¯åçæ°æ®ã对äºç¤¾äº¤å¹³å°ä¸å¡ç³»ç»ï¼å©ç¨å¹³å°æä¾çAPIæ¥å£ï¼è·åç¨æ·çç¹èµãè¯è®ºãå ³æ³¨çè¡ä¸ºæ°æ®ã以微å为ä¾ï¼éè¿ç³è¯·å¹¶è·åå¾®å弿¾å¹³å°çAPIå¯é¥ï¼ä½¿ç¨ç¸åºçAPIè°ç¨æ¹æ³ï¼è·åç¨æ·å¯¹å¾®åå 容çç¹èµãè¯è®ºæ°æ®ï¼ä»¥åç¨æ·ä¹é´çå ³æ³¨å ³ç³»æ°æ®çã\##\##3.2.2æ°æ®æ¸ æ´ä¸è½¬æ¢1.**å»é¤åªå£°æ°æ®**ï¼å¨è·åçæ°æ®ä¸ï¼å¯è½åå¨ä¸äºåªå£°æ°æ®ï¼å¦å¼å¸¸çè¯åæ°æ®ãéå¤çè®°å½çã对äºå¼å¸¸çè¯åæ°æ®ï¼è®¾å®è¯åçåçèå´ï¼å¦çµå½±è¯åé常å¨1-5åä¹é´ï¼å¯¹äºè¶ åºè¿ä¸ªèå´çæ°æ®è¿è¡å¤çãå¯ä»¥å°å ¶è§ä¸ºæ
ææ°æ®ç´æ¥å
é¤ï¼æè æ
¹æ®ä¸å®çè§åè¿è¡ä¿®æ£ã对äºéå¤çè®°å½ï¼å©ç¨æ°æ®åºçå»éåè½æç¼ç¨å®ç°å»éæä½ãä¾å¦ï¼å¨MySQLæ°æ®åºä¸ï¼å¯ä»¥ä½¿ç¨âSELECTDISTINCT*FROM[表å]âè¯å¥å»é¤éå¤è¡ãå¨Javaç¼ç¨ä¸ï¼å¯ä»¥å°æ°æ®åå¨å¨Setéåä¸ï¼å©ç¨Setéåçä¸é夿§æ¥å»é¤éå¤è®°å½ã2.**填补缺失å¼**ï¼æ°æ®ä¸å¯è½åå¨ç¼ºå¤±å¼ï¼å¦ç¨æ·å¯¹æäºç©åçè¯å缺失ã对äºè¯å缺失å¼ï¼å¯ä»¥éç¨åå¼å¡«å æ³ï¼è®¡ç®ææç¨æ·å¯¹è¯¥ç©åçå¹³åè¯åï¼ç¨å¹³åè¯åæ¥å¡«è¡¥ç¼ºå¤±å¼ãä¹å¯ä»¥éç¨åºäºç¨æ·ç¸ä¼¼åº¦çæ¹æ³ï¼æ¾å°ä¸è¯¥ç¨æ·ç¸ä¼¼åº¦è¾é«çå ¶ä»ç¨æ·ï¼ç¨è¿äºç¨æ·å¯¹è¯¥ç©åçè¯åçå
æå¹³å弿¥å¡«è¡¥ç¼ºå¤±å¼ãåè®¾ç¨æ·A对ç©åXçè¯å缺失ï¼éè¿è®¡ç®æ¾å°ä¸ç¨æ·Aç¸ä¼¼åº¦è¾é«çç¨æ·BãCï¼ç¨æ·B对ç©åXçè¯å为4åï¼ç¨æ·C对ç©åXçè¯å为5åï¼ä¸ç¨æ·Bä¸ç¨æ·Açç¸ä¼¼åº¦ä¸º0.8ï¼ç¨æ·Cä¸ç¨æ·Açç¸ä¼¼åº¦ä¸º0.7ï¼åå¡«è¡¥ç¨æ·A对ç©åXçè¯åå¯ä»¥è®¡ç®ä¸º(4Ã0.8+5Ã0.7)/(0.8+0.7)ã3.**æ°æ®æ
¼å¼è½¬æ¢**ï¼å°ééå°çæ°æ®è½¬æ¢ä¸ºéåç®æ³å¤ççæ
¼å¼ãä¾å¦ï¼å°æ¶é´æ
¼å¼çæ°æ®ç»ä¸è½¬æ¢ä¸ºæ
åçæ¶é´æ
¼å¼ï¼å¦âyyyy-MM-ddHH:mm:ssâãå¯¹äºææ¬æ°æ®ï¼è¿è¡åè¯ãå»åç¨è¯çé¢å¤çæä½ãå¨Javaä¸ï¼å¯ä»¥ä½¿ç¨åè¯å·¥å ·åºå¦HanLPè¿è¡ä¸æææ¬çåè¯ï¼ä½¿ç¨NLTKçå·¥å ·åºè¿è¡è±æææ¬çåè¯ãå»é¤åç¨è¯æ¶ï¼å¯ä»¥å»ºç«åç¨è¯è¡¨ï¼å°ææ¬ä¸çåç¨è¯ï¼å¦âçââæ¯ââå¨âçæ
å®é æä¹çè¯ï¼å»é¤ãå°è¯åæ°æ®è½¬æ¢ä¸ºæ°å¼ç±»åï¼æ¹ä¾¿åç»ç计ç®åå¤çã\##\##3.2.3æ°æ®åå¨ä¸ç®¡çç»è¿é¢å¤çåçæ°æ®åå¨å¨HDFSä¸ãå¨HDFSä¸å建ç¸åºçç®å½ç»ææ¥åå¨ä¸åç±»åçæ°æ®ï¼å¦å建â/data/recommendation/user-item-ratingâç®å½æ¥åå¨ç¨æ·-ç©åè¯åæ°æ®ï¼â/data/recommendation/user-infoâç®å½æ¥åå¨ç¨æ·ä¿¡æ¯æ°æ®ï¼â/data/recommendation/item-infoâç®å½æ¥åå¨ç©åä¿¡æ¯æ°æ®ã使ç¨Hadoopçå½ä»¤è¡å·¥å ·æJavaAPIå°æ°æ®ä¸ä¼
å°ç¸åºçç®å½ä¸ãä¾å¦ï¼ä½¿ç¨å½ä»¤âhdfsdfs-put[æ¬å°æä»¶è·¯å¾]/data/recommendation/user-item-ratingâå°æ¬å°çç¨æ·-ç©åè¯åæ°æ®æä»¶ä¸ä¼
å°HDFSçæå®ç®å½ãå¨Javaä¸ï¼å¯ä»¥ä½¿ç¨FileSystemç±»çç¸å ³æ¹æ³å®ç°æ°æ®ä¸ä¼
ï¼å¦ï¼```javaConfigurationconf=newConfiguration();FileSystemfs=FileSystem.get(conf);fs.copyFromLocalFile(newPath("localFilePath"),newPath("/data/recommendation/user-item-rating"));```卿°æ®ç®¡çæ¹é¢ï¼å»ºç«æ°æ®çæ¬ç®¡çæºå¶ï¼è®°å½æ¯æ¬¡æ°æ®æ´æ°çæ¶é´ãæ´æ°å 容çä¿¡æ¯ãå¯ä»¥ä½¿ç¨æ°æ®åºæ¥åå¨è¿äºçæ¬ä¿¡æ¯ï¼å½éè¦åæº¯æ°æ®æ¶ï¼å¯ä»¥æ
¹æ®çæ¬ä¿¡æ¯è·åç¸åºçæ¬çæ°æ®ã宿坹HDFSä¸çæ°æ®è¿è¡æ¸ çåä¼åï¼å
é¤è¿æçæ°æ®ï¼åå¹¶å°æä»¶ï¼ä»¥æé«æ°æ®åå¨å访é®çæçãä¾å¦ï¼éè¿ç¼åèæ¬å®æå
é¤è¶ è¿ä¸å®æ¶é´çå岿°æ®ï¼ä½¿ç¨HadoopçArchiveå·¥å ·å°å°æä»¶åå¹¶æå¤§æä»¶ã\##\#3.3SlopeOneç®æ³å¨Hadoopä¸çå®ç°æ¥éª¤\##\##3.3.1æå»ºè¾å ¥æ
¼å¼è®¾è®¡ç¬¦åHadoopMapReduceç¼ç¨æ¨¡åçè¾å ¥æ
¼å¼ï¼éç¨TextInputFormatä½ä¸ºè¾å ¥æ
¼å¼ãTextInputFormatä¼å°è¾å ¥æä»¶æè¡è¯»åï¼å°è¡å·ä½ä¸ºé®ï¼LongWritableç±»åï¼ï¼è¡å 容ä½ä¸ºå¼ï¼Textç±»åï¼ã对äºç¨æ·-ç©åè¯åæ°æ®æä»¶ï¼æ¯ä¸è¡çæ
¼å¼ä¸ºâç¨æ·ID,ç©åID,è¯åâï¼ä¾å¦â1,101,4âãå¨Mapperé¶æ®µï¼éè¦å°è¾å ¥çé®å¼å¯¹è¿è¡è§£æï¼æååºç¨æ·IDãç©åIDåè¯åãå¯ä»¥ä½¿ç¨Stringçsplitæ¹æ³å¯¹è¡å 容è¿è¡åå²ï¼è·åç¸åºçæ°æ®ãå¨MapReduceä½ä¸çé ç½®ä¸ï¼è®¾ç½®è¾å ¥æ
¼å¼ä¸ºTextInputFormatï¼å¦ï¼```javaConfigurationconf=newConfiguration();Jobjob=Job.getInstance(conf,"SlopeOneAlgorithm");job.setInputFormatClass(TextInputFormat.class);```åæ¶ï¼è®¾ç½®è¾å ¥è·¯å¾ï¼æå®è¦å¤ççç¨æ·-ç©åè¯åæ°æ®æä»¶å¨HDFSä¸çè·¯å¾ï¼å¦ï¼```javaFileInputFormat.addInputPath(job,newPath("/data/recommendation/user-item-rating/data.txt"));```\##\##3.3.2å®ç°MapperåReducer1.**Mapperåè½å®ç°**ï¼Mapperç主è¦åè½æ¯è¯»åè¾å ¥æ°æ®ï¼å°å ¶è½¬æ¢ä¸ºé®å¼å¯¹å½¢å¼ï¼å¹¶è¿è¡åæ¥çæ°æ®å¤çã对äºç¨æ·-ç©åè¯åæ°æ®ï¼Mapperå°æ¯ä¸è¡æ°æ®è§£æä¸ºç¨æ·IDãç©åIDåè¯åãç¶åï¼ä»¥ç©åIDä½ä¸ºé®ï¼ä»¥å å«ç¨æ·IDåè¯åçèªå®ä¹å¯¹è±¡ä½ä¸ºå¼è¾åºãä¾å¦ï¼èªå®ä¹ä¸ä¸ªUserRatingç±»ï¼å å«ç¨æ·IDåè¯åä¸¤ä¸ªå±æ§ãå¨Mapperçmapæ¹æ³ä¸å®ç°å¦ä¸ï¼```javapublicclassSlopeOneMapperextendsMapper<LongWritable,Text,Text,UserRating>{@Overrideprotectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{Stringline=value.toString();String[]parts=line.split(",");StringuserId=parts[0];StringitemId=parts[1];floatrating=Float.parseFloat(parts[2]);UserRatinguserRating=newUserRating(userId,rating);context.write(newText(itemId),userRating);}}```2.**Reduceråè½å®ç°**ï¼Reduceræ¥æ¶Mapperè¾åºçé®å¼å¯¹ï¼å ¶ä¸é®ä¸ºç©åIDï¼å¼ä¸ºå å«ä¸åç¨æ·IDåè¯åçUserRating对象å表ãReducerç主è¦ä»»å¡æ¯è®¡ç®ç©åä¹é´çå¹³ååå·®ãå¯¹äºæ¯ä¸ªç©åIDï¼Reduceréåå ¶å¯¹åºçUserRating对象åè¡¨ï¼æ¾å°åæ¶å¯¹è¯¥ç©ååå ¶ä»ç©åè¯åçç¨æ·ï¼è®¡ç®è¿äºç¨æ·å¯¹è¿ä¸¤ä¸ªç©åçè¯åå·®å¼ï¼è¿è计ç®åºå¹³ååå·®ãä¾å¦ï¼å设æç©åAåç©åBï¼æ¾å°åæ¶å¯¹ç©åAåç©åBè¯åçç¨æ·ï¼è®¡ç®æ¯ä¸ªç¨æ·å¯¹ç©åBåç©åAçè¯åå·®å¼ï¼ç¶åå°è¿äºå·®å¼ç´¯å
å¹¶é¤ä»¥ç¨æ·æ°éï¼å¾å°ç©åBç¸å¯¹äºç©åAçå¹³ååå·®ãå¨Reducerçreduceæ¹æ³ä¸å®ç°å¦ä¸ï¼```javapublicclassSlopeOneReducerextendsReducer<Text,UserRating,Text,Float>{@Overrideprotectedvoidreduce(TextitemId,Iterable<UserRating>userRatings,Contextcontext)throwsIOException,InterruptedException{//åå¨ç©åä¹é´çè¯åå·®å¼åç¨æ·æ°éMap<Text,Pair<Float,Integer>>diffMap=newHashMap<>();for(UserRatinguserRating1:userRatings){for(UserRatinguserRating2:userRatings){if(!userRating1.getUserId().equals(userRating2.getUserId())){TextotherItemId=newText(userRating2.getItemId());floatdiff=userRating1.getRating()-userRating2.getRating();if(diffMap.containsKey(otherItemId)){Pair<Float,Integer>pair=diffMap.get(otherItemId);pair.setFirst(pair.getFirst()+diff);pair.setSecond(pair.getSecond()+1);}else{diffMap.put(otherItemId,newPair<>(diff,1));}}}}//计ç®å¹³åå差并è¾åºfor(Map.Entry<Text,Pair<Float,Integer>>entry:diffMap.entrySet()){floatavgDiff=entry.getValue().getFirst()/entry.getValue().getSecond();context.write(newText(itemId+","+entry.getKey().toString()),avgDiff);}}}```\##\##3.3.3ç»æè¾åºä¸åå¨å°Reducer计ç®å¾å°çç©åä¹é´çå¹³ååå·®ç»æè¾åºå¹¶åå¨å¨HDFSä¸ãå¨MapReduceä½ä¸çé ç½®ä¸ï¼è®¾ç½®è¾åºæ
¼å¼ä¸ºTextOutputFormatï¼å¦ï¼```javajob.setOutputFormatClass(TextOutputFormat.class);```设置è¾åºè·¯å¾ï¼æå®ç»ææä»¶å¨HDFSä¸çåå¨è·¯å¾ï¼å¦ï¼```javaFileOutputFormat.setOutputPath(job,newPath("/data/recommendation/slope-one-result/avg-diff.txt"));```ç»ææä»¶çæ¯ä¸è¡æ
¼å¼ä¸ºâç©å\##åãåºäºHadoopçSlopeOneæ¹è¿ç®æ³å®ç°\##\#4.1SlopeOnewithBiasesç®æ³å®ç°\##\##4.1.1ç®æ³åçå¨Hadoopä¸çæ
å°å¨Hadoopç¯å¢ä¸å®ç°SlopeOnewithBiasesç®æ³ï¼é¦å è¦å¯¹ç®æ³åçè¿è¡åççæ
å°ãå¨åæºççSlopeOnewithBiasesç®æ³ä¸ï¼è®¡ç®ç¨æ·åå·®åç©ååå·®éè¦éåæ´ä¸ªç¨æ·-ç©åè¯åç©éµãå¨Hadoopå¹³å°ä¸ï¼å©ç¨MapReduceæ¨¡åæ¥å®ç°è¿ä¸è¿ç¨ãå¨ç¬¬ä¸ä¸ªMapReduceä»»å¡ä¸ï¼Mapperè´è´£è¯»åç¨æ·-ç©åè¯åæ°æ®ï¼å°ç¨æ·IDåç©åIDåå«ä½ä¸ºé®è¾åºï¼åæ¶å°è¯åä½ä¸ºå¼è¾åºãä¾å¦ï¼å¯¹äºè¾å ¥æ°æ®âç¨æ·1,ç©åA,4âï¼Mapperä¼è¾åºé®å¼å¯¹ï¼ç¨æ·1,4ï¼åï¼ç©åA,4ï¼ãReduceråæ
¹æ®æ¥æ¶å°çé®å¼å¯¹ï¼åå«è®¡ç®æ¯ä¸ªç¨æ·çå¹³åè¯ååæ¯ä¸ªç©åçå¹³åè¯åã以计ç®ç¨æ·å¹³åè¯å为ä¾ï¼Reducerä¼å°ææä»¥åä¸ç¨æ·ID为é®çè¯åå¼ç´¯å
èµ·æ¥ï¼å¹¶è®°å½è¯å次æ°ï¼æå计ç®åºè¯¥ç¨æ·çå¹³åè¯åãåæ
·çæ¹å¼ï¼è®¡ç®åºæ¯ä¸ªç©åçå¹³åè¯åãç¶åï¼æ
¹æ®ææç¨æ·å¯¹ææç©åçå¹³åè¯åï¼è®¡ç®åºç¨æ·åå·®åç©ååå·®ãå¨ç¬¬äºä¸ªMapReduceä»»å¡ä¸ï¼Mapper读åç¨æ·-ç©åè¯åæ°æ®ï¼ç»åä
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年元氏县教师招聘考试参考题库及答案解析
- 中国工商银行四川省分行2027届校园招聘1000人笔试模拟试题及答案解析
- 2026年宿州市建设工程质量检测中心招聘工作人员笔试备考题库及答案解析
- 中国建设银行总行直属机构2027届校园招聘笔试备考试题及答案解析
- 北京市肛肠医院(北京市二龙路医院)公开招聘考试备考试题及答案解析
- 2026年延寿县教师招聘笔试备考题库及答案解析
- 2026年池州消防招录政府专职消防员26名考试备考试题及答案解析
- 2025年广元市市中区事业单位人员招聘笔试试题及答案详解
- 2026-吉林博物馆企业文化专员招聘考试参考题库-含答案
- 2026年尚义县教师招聘笔试参考题库及答案解析
- 2025~2026学年七年级上学期第一次月考数学试卷2【附解析】
- 2025年4月自学考试中国古代文学史(二)00539试卷及答案解释完整版
- 加入保险行业的十五大理由
- 社区公文写作格式和范文(15篇)
- GB/T 12823.2-2026摄影和图形技术密度测量第2部分:透射密度的几何条件
- DB53T 168-2013 云南省用水定额
- TAVR麻醉管理策略
- 超声引导关节腔注射
- 心内科出科讲课
- 高一年级9月月考物理试卷(含答案)
- T/CTRA 01-2020废轮胎/橡胶再生油
评论
0/150
提交评论