基于Spark的电商用户行为实时分析系统_第1页
基于Spark的电商用户行为实时分析系统_第2页
基于Spark的电商用户行为实时分析系统_第3页
基于Spark的电商用户行为实时分析系统_第4页
基于Spark的电商用户行为实时分析系统_第5页
已阅读5页,还剩38页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录摘要 [14]。图STYLEREF1\s2SEQ图\*ARABIC\s14Spark运行架构Spark架构以及相关组件SparkCore,作为Spark框架的基石,肩负着实现框架核心功能的重任,包括任务调度、内存管理、错误恢复以及与存储系统的协同工作。其核心组成部分之一是RDD(ResilientDistributedDataset,弹性分布式数据集)API,这一API为处理大规模数据提供了一种高效且灵活的抽象数据结构。RDD代表了可以在多个计算节点上并行操作的元素集合,它使得数据能够跨越多个节点进行分布式存储和处理。通过数据分片(Partitioning),RDD能够将数据分割成多个独立的片段,每个片段在相应的节点上独立处理,从而实现数据的并行计算。此外,RDD还支持数据缓存机制,允许将频繁访问的数据存储在内存中,从而显著提高处理速度。这些特性共同使得SparkCore在处理大规模数据时具有出色的性能和效率。在SparkCore的基础上,Spark提供了多种组件,这些组件满足了多种应用需求,其分别为SparkSQL、SparkStreaming、SparkMLlib、SparkGraphX。如REF_Ref152681975\h图25所示。图STYLEREF1\s2SEQ图\*ARABIC\s15Spark架构图本系统主要使用SparkStreaming组件,作为Spark生态系统的重要组件,赋予了Spark处理实时数据流的能力,从而实现了实时数据处理与分析的功能。SparkStreaming通过将连续的实时数据流切分成一系列小规模的批处理数据,使得这些数据能够在Spark集群上高效地执行。SparkStreaming提供两种灵活的数据流处理方式:基于时间窗口的处理和基于事件的处理:基于时间窗口的处理将一段时间内的数据流处理为一个批,而基于事件的处理则是对单个事件进行处理。SparkStreaming可以使用Kafka、Flume、Kinesis等多种数据源,同时也可以使用文件和套接字等本地数据源。本章小结本章主要对相关的技术和基础理论进行了全面的概述。首先,探讨了Hadoop的两大核心功能:HDFS的体系架构和元数据管理机制。在了解了HDFS的基础上,介绍了其他与大数据处理相关的重要组件。最后,重点阐述了本文所使用的大数据并行处理框架Spark的架构及其核心原理机制,为后续的研究和应用提供了坚实的理论基础。电商用户行为实时分析系统的需求分析本章节将对电商用户行为实时分析体系的需求展开深入探讨,聚焦于功能需求和非功能需求这两个核心方面。我们将逐一阐述这些需求,为接下来系统的设计和实现提供清晰的方向和思路。功能需求分析本系统再基于用户的自身属性与行为数据的基础上用户活跃率分析:日活跃用户数量(DAU)指的是在24小时内访问或使用应用、小程序、网站等不同设备端的唯一用户总数。在这个统计中,新注册的用户也被视为活跃用户,无论他们在应用中的具体使用情况如何。需要注意的是,即使同一台设备在一天内多次打开应用,也只会被计为一个活跃用户。这个指标是衡量一个平台或应用受欢迎程度和用户粘性的重要指标之一。每天一台设备打开多次应用会被计为一个活跃用户,同一天在不同设备端在打开应用的同一用户同样被计为一个活跃用户。可以通过不同的维度去分析日活用户,可以从地区、年龄、设备端等维度单个或多个同时分析日活跃用户的分布以及日活跃率。除了DAU,还有周活跃用户数量(WAU)和月活跃用户数量(MAU)等不同指标用来分析用户。通过对日活跃用户的数据分析,可以了解用户的活跃度和忠诚度,从而优化运营策略,提高用户留存率和转化率。具体业务如下:统计日活跃用户数。统计活跃用户留存率。统计日活跃用户数每日增长率。按省市统计日活跃用户数,再以年龄段细分用户群。统计各端日活跃用户数。以分为单位统计出页面访问趋势。转化率分析:网站转化率(ConversionRate)是一个衡量网站性能的关键指标,它反映了访客在访问网站后采取特定目标行动(如登录、注册、订阅、下载或购买等)的比例。简而言之,转化率是将访客转化为网站常驻用户的过程。具体业务如下:统计页面单跳转换率。订单分析:企业在电商平台中的操作和决策目的都是为了引导用户最终下订单、购买商品并完成交易。为了实现这一目标,企业需要对订单数据进行分析,以深入了解用户的购买行为、购买偏好以及购买决策过程。例如,订单分析可以揭示哪些商品最受欢迎,哪些营销活动最有效,哪些用户最具有潜力成为忠实客户。这些信息有助于企业制定更精准的商品策略、营销策略和客户服务策略,以提升用户满意度和忠诚度。这些信息有助于企业优化商品布局、提升用户体验、改进营销策略,从而提高转化率和销售额。基于以上分析结果,企业可以制定更加精准的营销策略和优化商品布局,从而提高电商平台的优越性和盈利性。同时,订单分析还可以帮助企业及时发现潜在的问题和风险,如库存积压、退货率高等,从而采取相应的措施加以解决。订单分析是电商平台运营中不可或缺的一环。它可以帮助企业更好地了解用户需求和市场趋势,从而制定更加科学合理的运营策略,提高电商平台的竞争力和盈利能力。具体业务如下:以年龄、性别、地区为维度进行订单分析。统计订单取消原因分类。统计各地区订单分布量。非功能需求分析性能需求本文所探讨的系统的核心职责在于高效处理庞大的用户行为数据。鉴于处理的数据量巨大,对系统的性能提出了极高的要求。在构建该系统时,深入考虑了多个关键因素,包括系统架构的合理性、业务需求的满足度、算法设计的优化以及数据库设计的效率。我们的目标是开发一个既稳定又高效的应用系统。首先,它必须拥有极低的内存占用率,以确保在处理大量数据时不会因资源不足而崩溃。其次,后台系统应具备强大的计算能力,能够迅速响应和分析数据流。安全性需求在进行数据存储的过程中,为防数据丢失、损坏,要在不同的设备中进行多次数据备份。同时为保证数据安全,需通过加密算法保证在数据的存储、传输、读取过程中不被盗取和修改。做好账号密码的安全,使用高强度密码,严格分配权限。易用性需求对于开发人员,编写符合规范的代码、添加详尽的注释以及提供友好的交互接口是至关重要的。通过编写高质量的代码,我们能够确保系统的稳定性和可扩展性,为电商用户行为分析系统的长期运行和持续发展奠定坚实的基础。对于平台使用者来说,简洁直观且易于使用的平台功能是至关重要的。在发布各项任务时,应有标记字样以帮助使用者更好地利用平台。在界面设计上,平台应充分考虑用户的操作习惯和需求,以提供符合大众期望的用户体验。这些措施将有助于提升平台的易用性和用户满意度。本章小结本章节对设计的用户行为实时分析系统进行了深入的需求分析。首先,从业务角度出发,详细探讨了系统的需求背景和发展方向,明确了需要实现的业务功能及其流程。其次,从功能角度对系统进行了细致的分析,确定了整个业务流程中的关键功能点。最后,从系统性能、安全性和易用性三个方面进行了全面的阐述,以确保系统能够满足用户的实时分析需求,并提供稳定、安全、易用的操作体验。项目体系架构设计系统架构设计本系统架构采用分层架构设计思想将其分为四层,从下至上依次为数据源层、数据处理层、数据存储层、数据展示层,如REF_Ref154060398\h图41所示。图STYLEREF1\s4SEQ图\*ARABIC\s11系统架构流程图数据源层:数据源层是数据处理流程的基础,其主要功能是为Spark集群提供处理所需的数据。输送的数据包含两种类型数据,一种是页面日志数据,本文数据来源为模拟日志数据,模拟用户在网站上进行浏览、搜索、点击等操作,这些操作日志会被记录并直接发送到Kafka集群的主题中;另外一个业务数据,数据存储在Mysql表结构中,通过Maxwell工具进行抽取和转换,然后发送到Kafka集群的主题中。这两种数据类型的数据源在数据源层中相互补充,为后续的数据处理提供了丰富的数据来源。数据源层除了提供数据输入,还负责数据的初始清洗和格式化。由于Spark集群需要实时处理数据,因此数据源层需要保证数据的实时性,尽可能减少数据的延迟。同时,为了确保数据的可靠性,需要采取一些措施,如数据备份、数据校验等。在设计和实现数据源层时,需要充分考虑各种因素,确保数据的准确性和可靠性。数据处理层:数据处理层是整个数据处理流程的核心,负责从数据源层接收数据,进行一系列的数据处理和分析,并将处理后的数据结果输出到数据存储层。在Spark集群环境中,利用SparkStreaming组件来实时消费Kafka集群中的数据。SparkStreaming能够高效地实时读取Kafka中的数据流,并对其进行处理与分析。这种集成使得我们可以及时处理来自Kafka的实时数据,并利用Spark的强大计算能力对数据进行快速分析和处理。使用开发工具编写业务逻辑代码,并将其打包成Jar包上传到主机的相关目录当中,使用Spark集群启动任务,并通过Yarn资源调度来管理和资源分配。在数据处理过程中,需要根据业务需求对数据进行清洗、转换、分析和挖掘等操作。例如,对于页面日志数据,可能需要提取用户行为特征、分析用户兴趣等;对于业务数据,可能需要进行数据整合、数据挖掘等操作。处理后的数据结果需要输出到数据访问层的ElasticSearch当中,以便后续的数据查询和分析。数据存储层:该层主要由部署在Linux环境中的ElasticSearch集群构成,负责存储来自数据处理层输出的结果数据。通过ElasticSearch集群,能够高效地存储、检索和分析这些数据,以便数据展示层能够实时调用所需数据,为用户提供准确、快速的数据展示服务。该层在系统框架中起到承上启下的作用,对于数据处理层来说,此层是数据的输出终点;对于数据展示层来讲,此层是数据的输入起点。数据展示层:数据展示层是整个数据处理流程的最后一环,它负责将处理后的数据以可视化的形式展示给用户,以便用户能够直观地了解数据和分析结果。前端页面使用Vue框架并结合Echars数据可视化工具进行编写,以提供直观、清晰的数据展示界面。然后,将前端页面打包部署到Linux操作系统中的Nginx服务器上,以便用户可以通过浏览器访问。后端服务使用目前流行的SpringBoot框架搭建,它简化了后端服务的搭建和开发过程。SpringBoot自身集成了SpringMVC框架,负责模型、视图、控制器的分离,与前端页面进行数据交互。通过JavaAPI操作ElasticSearch,读取存储在其中的数据,并将数据写入接口,以便前端调用。数据展示层需要充分考虑用户的需求和体验,提供直观、清晰、易于理解的数据展示界面。同时,还需要保证后端服务的稳定性和安全性,确保数据的准确性和可靠性。系统的功能模块设计本系统按照第三章的业务需求将功能模块进行了细分,如REF_Ref154065879\h图42所示。图STYLEREF1\s4SEQ图\*ARABIC\s12系统功能模块图用户日活跃分析:(1)统计日活跃用户数收集用户在平台或应用上的活动数据。这些数据包括用户的登录信息、访问时间戳、进行的操作等。在统计日活跃用户之前,需要明确什么是“活跃用户”。一般来说,如果用户在某一天内访问了你的平台或应用,就可以被定义为这一天的活跃用户。例如,用户可能需要完成某些特定的操作(如签到、浏览页面、提交表单等)才能被算作活跃用户。在收集到用户活动数据后,可能需要进行一些数据清洗和过滤工作,以去除重复数据、异常值或无效数据。根据日期对用户活动数据进行分组,并对每组内的用户数量进行计数,就可以得到每一天的活跃用户数量。(2)获取活跃用户留存率留存率是衡量用户粘性的重要指标,它反映了用户在使用产品或服务后的持续活跃程度。在电商行业中,提高留存率对于企业的长远发展至关重要。活跃用户留存率作为一个关键的运营指标,用于评估网站、应用或游戏的用户粘性。这个指标通过计算在统计周期内,每日活跃用户在之后的第N日仍然使用该App的用户数占比的平均值来衡量。通常,N的取值包括2、4、8、15、31,分别对应着次日留存率、三日留存率、周留存率、半月留存率和月留存率。应用特定的计算公式4.1。RN=aN/a∗100%(N≥2)(STYLEREF1\s4.SEQ公式\*ARABIC\s11)式中:RNaNa(3)统计日活跃用户增长率先统计出今日的日活跃用户数,再与昨日的日活跃用户数做对比,利用公式4.2得出增长率。R=an−an−1/an−1∗100%(n≥2)(STYLEREF1\s式中:R——活跃用户增长率anan−(4)按省市统计日活跃用户数,再以年龄段统计用户群以省市为维度,统计日活跃用户数,再以五个年龄段(0-18,19-29,30-39,40-49,50以上)分组聚合统计日活跃用户数。(5)获取各端日活跃用户数以访问平台的设备端为维度,统计日活跃用户数。(6)统计每分钟页面访问量确定要统计的时间范围,例如一天、一周、一个月等。收集用户在指定时间范围内的页面浏览数据。对于每个时间范围,将页面浏览量除以该时间范围内的分钟数,即可得到每分钟的页面浏览量。转化率分析:(1)统计页面单跳转换率在一次用户会话(Session)中,如果用户按顺序访问了页面A、B、C、D,那么从页面A跳转到页面B被视为一次单跳。具体计算方法是:首先统计符合条件的会话中页面A访问次数(PV)为Av,然后统计这些会话中既访问了页面A又紧接着访问了页面B的访问次数为Bv。最终,单跳转化率即为Bv订单分析:以年龄、性别、地区为维度进行订单分析统计平台使用者设定的时间范围内,每个用户在此时间内购买商品订单,以性别为维度,统计不同地区所购买订单数和订单金额的性别差异。以年龄为维度进行分组:18岁以下、18-20岁以上,五个组别,统计不同地区所购买的订单数和订单金额年龄差异。统计订单取消原因分类以饼图和条形图统计订单取消原因。统计各地区订单分布量以中国地图为标准,以热力图形式统计每个地区的订单数及订单金额。数据库设计Mysql数据库设计用户信息(user_info)表如REF_Ref160195869\h表4.1所示。表STYLEREF1\s4.SEQ表\*ARABIC\s11用户信息(user_info)表字段数据类型注解idbigint编号login_namevarchar用户名称nick_namevarchar用户昵称passwdvarchar用户密码namevarchar用户姓名phone_numvarchar手机号emailvarchar邮箱head_imgvarchar头像user_levelvarchar用户级别birthdaydate用户生日gendervarchar性别M男,F女create_timedatetime创建时间operate_timedatetime修改时间statusvarchar状态订单信息(order_info)表如REF_Ref160196142\h表4.2所示。表STYLEREF1\s4.SEQ表\*ARABIC\s12订单信息(order_info)表字段数据类型注解idbigint编号consigneevarchar收货人consignee_telvarchar收件人电话total_amountdecimal总金额order_statusvarchar订单状态user_idbigint用户idpayment_wayvarchar付款方式delivery_addressvarchar送货地址order_commentvarchar订单备注out_trade_novarchar订单交易编号trade_bodyvarchar订单描述(第三方支付用)create_timedatetime创建时间operate_timedatetime操作时间expire_timedatetime失效时间process_statusvarchar进度状态tracking_novarchar物流单编号parent_order_idbigint父订单编号img_urlvarchar图片路径province_idint地区activity_reduce_amountdecimal促销金额coupon_reduce_amountdecimal优惠券original_total_amountdecimal原价金额feight_feedecimal运费feight_fee_reducedecimal运费减免refundable_timedatetime可退款日期(签收后30天)订单详细(order_detail)表如REF_Ref160369760\h表4.3所示。表STYLEREF1\s4.SEQ表\*ARABIC\s13订单详细(order_detail)表字段数据类型注解idbigint编号order_idbigint订单编号sku_idbigintsku_idsku_namevarcharsku名称(冗余)img_urlvarchar图片名称(冗余)order_pricedecimal购买价格(下单时sku价格)sku_numvarchar购买个数create_timedatetime创建时间source_typevarchar来源类型source_idbigint来源编号split_total_amountdecimal减免后金额split_activity_amountdecimal活动减免split_coupon_amountdecimal优惠券减免购物车信息(cart_info)表如REF_Ref160369927\h表4.4所示。表STYLEREF1\s4.SEQ表\*ARABIC\s14购物车信息(cart_info)表字段数据类型注解idbigint编号user_idvarchar用户idsku_idbigintskuidcart_pricedecimal放入购物车时价格sku_numint数量img_urlvarchar图片文件sku_namevarcharsku名称(冗余)is_checkedint是否选择create_timedatetime创建时间operate_timedatetime修改时间is_orderedbigint是否已经下单order_timedatetime下单时间source_typevarchar来源类型source_idbigint来源编号基础字典(base_dic)表如REF_Ref160370064\h表4.5所示。表STYLEREF1\s4.SEQ表\*ARABIC\s15基础字典(base_dic)表字段数据类型注解dic_codevarchar编号dic_namevarchar编码名称parent_codevarchar父编号create_timedatetime创建日期operate_timedatetime修改日期ElasticSearch数据库设计日活用户信息宽表:gmall_order_detail_wide_*。页面启动日志宽表:gmall_page_start_wide_*。页面信息宽表:gmall_page_info_wide_*。订单信息宽表:gmall_order_info_wide_*。订单详细详细宽表:gmall_order_detail_wide_*。订单退款信息宽表:gmall_order_refund_info_wide_*。本章小结本章节全面规划了该系统的整体架构,并详细阐述了各模块的设计理念和原则。基于系统的功能需求模块,确保了系统的实用性和高效性。此外,还对系统在使用过程中所涉及的关系型Mysql数据库和非关系型ElasticSearch数据库进行了详细的表结构设计,以确保数据的存储和检索能够满足系统的各种需求。系统实现与展示本章节将基于Spark的电商用户行为实时分析系统的具体实现。首先,搭建了系统的开发环境,并完成了运行时环境中各集群的部署工作。随后,实现了数据预处理功能和数据可视化功能,以便更好地处理和分析电商用户的行为数据。最后,详细描述了系统所设计的各个功能模块的实现过程,并展示了相应的成果图。开发环境及集群启动开发环境硬件配置信息表如REF_Ref160371594\h表5.1所示,其中主机名为Hadoop101的计算机为主节点(Master),其余两台为从节点(Slave)。软件配置信息如REF_Ref160371725\h表5.2所示。表STYLEREF1\s5.SEQ表\*ARABIC\s11硬件配置信息表主机名IP地址HDFSSparkZookeeperKafkaHadoop101192.168.32.101NN、DN、NMMaster、WorkerLeaderKafkaHadoop102192.168.32.102DN、RM、NMMaster、WorkerFollowerKafkaHadoop103192.168.32.103NN2、DN、NMWorkerFollowerKafka表STYLEREF1\s5.SEQ表\*ARABIC\s12软件配置信息表软件名称软件版本Javajdk1.8.0_301Scala2.12.10Hadoop3.3.1Mysql5.6.51ElasticSearch7.7.0Redis6.2.10Zookeeper3.6.3Kafka3.0.0Spark3.1.3SpringBoot2.7.15Nginx1.6.2集群启动将本地代码上传到Hadoop101中,并启动集群。集群启动会使用很多命令,非常繁琐,且有些工具必须先启动才能后启动,例如Kafka必须在Zookeeper启动完全后才能启动,所以编写集群启动脚本可以自动启动和停止集群,方便管理集群。当集群启动完全时,三台计算机进程如REF_Ref160374163\h图51所示。图STYLEREF1\s5SEQ图\*ARABIC\s11三台计算机进程图系统功能实现当原始数据进入Kafka队列当中后,通过运行命令REF_Ref160630732\h代码5.1,启动分流代码将不同事件、行为分流到不同的Kafka主题当中,方便后续处理。其中ods.LogODS代码是分流日志数据,包含启动日志数据、页面访问日志数据、页面动作日志数据、页面曝光日志数据和错误日志数据;ods.DBODS代码是分流业务数据,启动包含事实数据和维度数据。事实数据包括订单数据、购物数据、收藏数据等,维度数据包括用户信息、地理信息等。代码STYLEREF1\s5.SEQ代码\*ARABIC\s11日志数据和业务数据分流启动命令nohupspark-submit--masterspark://hadoop101:7077,hadoop102:7077,hadoop103:7077–classods.LogODS/home/training/gmall/gmall-realtime-spark-1.0-SNAPSHOT.jar>/home/training/gmall/logs/gmall-realtime/ods.LogODS.log2>&1&nohupspark-submit--masterspark://hadoop101:7077,hadoop102:7077,hadoop103:7077–classods.DBODS/home/training/gmall/gmall-realtime-spark-1.0-SNAPSHOT.jar>/home/training/gmall/logs/gmall-realtime/ods.DBODS.log2>&1&Kafka消费问题实时计算任务进行计算,到数据结果存盘之前,进程崩溃,如果在进程崩溃前Kafka调整了偏移量,Kafka就会认为数据已经被处理过,即使进程重启,Kafka也会从新的偏移量开始,所以之前没有保存的数据就被丢失掉了。为了解决这一问题,可以使用Redis来读取和存储Kafka偏移量。创建偏移量工具类如REF_Ref160375389\h代码5.2所示。在driver运行开始时读取该Kafka主题偏移量,在结束时保存该主题偏移量。代码STYLEREF1\s5.SEQ代码\*ARABIC\s12偏移量工具类defsaveOffset(topicName:String,groupId:String,offsetRanges:Array[OffsetRange]):Unit={//定义Java的map集合,用于向Redis中保存数据valoffsetMap:util.HashMap[String,String]=newutil.HashMap[String,String]()//对封装的偏移量数组offsetRanges进行遍历for(offset<-offsetRanges){//分区valpartition:Int=offset.partition//起始点valfromOffset:Long=offset.fromOffset//结束点valuntilOffset:Long=offset.untilOffset//封装到Map集合中offsetMap.put(partition.toString,untilOffset.toString)//打印println("offset:"+topicName+":"+groupId+"保存分区偏移量:"+partition+":"+fromOffset+">"+untilOffset)}//拼接Redis中存储偏移量的keyvaloffsetKey:String="offset:"+topicName+":"+groupId//如果需要保存的偏移量不为空执行保存操作if(offsetMap!=null&&!offsetMap.isEmpty){//获取Redis客户端valjedis:Jedis=RedisUtil.getJedisClient//保存到Redis中jedis.hmset(offsetKey,offsetMap)//关闭客户端jedis.close()}}}日志数据分流SparkStreaming设置每5秒统计一次。通过循环RDD,判断日志类型,发送到相应的主题当中,以启动日志风流为例,启动日志分流代码如REF_Ref160376160\h代码5.3所示。第13行和第25行通过获取数据类型判断日志类型,第13行到22行提取公共信息,包含用户ID、设备ID、地区ID等信息。第27到31行代码提取启动日志专有信息,第33行代码将公共信息和专有信息封装到已建好的模型(StartLog)中,生产数据到主题(dwd_start_log)中。代码STYLEREF1\s5.SEQ代码\*ARABIC\s13日志数据分流代码//TODO5.分流数据baseParseDStream.foreachRDD(rdd=>{rdd.foreach(baseParse=>{//错误日志valerr:String=baseParse.getString("err")if(err!=null){//发送到错误主题中KafkaUtil.send(dwd_error_info,baseParse.toJSONString())}else{//提取公共信息valcommonObj:JSONObject=baseParse.getJSONObject("common")valmid:String=commonObj.getString("mid")valuid:String=commonObj.getString("uid")valpi:Int=commonObj.getInteger("ar")valch:String=commonObj.getString("ch")valos:String=commonObj.getString("os")valmd:String=commonObj.getString("md")valvc:String=commonObj.getString("vc")valisNew:String=commonObj.getString("is_new")valts:Long=baseParse.getLong("ts")//启动日志valstartObj:JSONObject=baseParse.getJSONObject("start")if(startObj!=null){valentry:String=startObj.getString("entry")valloadingTimeMs:Long=startObj.getLong("loading_time_ms")valopenAdId:String=startObj.getString("open_ad_id")valopenAdMs:Long=startObj.getLong("open_ad_ms")valopenAdSkipMs:Long=startObj.getLong("open_ad_skip_ms")//封装BeanvalstartLog:StartLog=StartLog(mid,uid,pi,ch,isNew,md,os,vc,entry,openAdId,loadingTimeMs,openAdMs,openAdSkipMs,ts)//发送到启动主题中KafkaUtil.send(dwd_start_log,JSON.toJSONString(startLog,JSONWriter.Feature.FieldBased))}}KafkaUtil.flush()})})业务数据分流首先在Redis缓存中建好事实表和维度表信息,如REF_Ref160377088\h图52所示。业务数据存储在Mysql数据库当中,当表数据发生变化时,Maxwell工具将会抽取变化的数据发送到原始业务主题中。业务数据分流代码如REF_Ref160376872\h代码5.4所示。首先从Redis中读取事实表和维度表(3-12行),如果变化数据为事实表,则进行分流,与日志数据分流程序相同。如果变化数据为维度数据,则存储在Redis缓存中,方便以后进行维度合并。图STYLEREF1\s5SEQ图\*ARABIC\s12事实表和维度表信息图代码STYLEREF1\s5.SEQ代码\*ARABIC\s14业务数据分流代码baseDBParseDStream.foreachRDD(rdd=>{valjedis:Jedis=RedisUtil.getJedisClientvalfactTableKey:String="FACT:TABLES"valdimTableKey:String="DIM:TABLES"//从redis中读取表清单valfactTables:util.Set[String]=jedis.smembers(factTableKey)valdimTables:util.Set[String]=jedis.smembers(dimTableKey)//做成广播变量valfactTablesBC:Broadcast[util.Set[String]]=ssc.sparkContext.broadcast(factTables)valdimTablesBC:Broadcast[util.Set[String]]=ssc.sparkContext.broadcast(dimTables)jedis.close()维度合并以统计日活跃用户维度合并为例,通过循环获取单个pageLog。从Redis中读取用户维度信息和地区维度信息。并进行日期格式转换。将合并好的数据存在日活用户宽表(dailyActiveUserInfoWide)中。再通过“toIterator”函数将迭代器转换为可迭代的集合。数据存储处理好的宽表数据统一存储在ElasticSearch数据库中,方便后续可视化后端程序调用。以日活用户数据存储为例。数据存储代码如REF_Ref160377984\h代码5.5所示。通过获取每条数据中的时间字段数据,作为文档拼接后缀(11-14行),防止前一天数据存储到后一天数据当中。在存储完全结束后保存当前偏移量(20行)。代码STYLEREF1\s5.SEQ代码\*ARABIC\s15数据存储代码//TODO8.写入ESdailyActiveUserInfoWideWithDimDStream.foreachRDD(rdd=>{rdd.foreachPartition(dailyActiveUserInfoWideIter=>{//转换数据结构,保证幂等写入valdailyActiveUserInfoWides:List[(String,DailyActiveUserInfoWide)]=dailyActiveUserInfoWideIter.toList.map(dailyActiveUserInfoWide=>(dailyActiveUserInfoWide.mid,dailyActiveUserInfoWide))valstringToWides:Map[String,List[(String,DailyActiveUserInfoWide)]]=dailyActiveUserInfoWides.groupBy(_._2.dt)for(elem<-stringToWides){if(elem._2.nonEmpty){//从数据中获取日期,拼接ES的索引名valsearchKeywordInfoWideT:(String,DailyActiveUserInfoWide)=elem._2.headvaldt:String=searchKeywordInfoWideT._2.dtESUtil.bulkSaveIdempotent(elem._2,s"gmall_daily_active_user_info_wide_$dt")}}})//TODO9.提交偏移量OffsetUtil.saveOffset(topic,groupId,offsetRanges)})系统功能展示通过SpringBoot编写后端接口,从ElasticSearch中获取不同文档数据,根据功能需求编写功能代码。前端使用Vue框架和Echarts插件进行可视化展示。用户日活跃分析统计日活跃用户数效果图如REF_Ref160465986\h图53所示。图STYLEREF1\s5SEQ图\*ARABIC\s13日活跃用户数图获取活跃用户留存率效果图如REF_Ref160466006\h图54所示。图STYLEREF1\s5SEQ图\*ARABIC\s14活跃用户留存率统计图统计日活跃用户每日增长率效果图如REF_Ref160466102\h图55所示。图STYLEREF1\s5SEQ图\*ARABIC\s15日活跃用户每日增长率统计图按省市统计日活跃用户数,再以年龄段统计用户群效果图如REF_Ref160466097\h图56所示。图STYLEREF1\s5SEQ图\*ARABIC\s16日活用户地区与年龄分布图获取各端日活跃用户数效果图如REF_Ref160466092\h图57所示。图STYLEREF1\s5SEQ图\*ARABIC\s17各端日活跃用户数及趋势图统计每分钟页面访问量效果图如REF_Ref160466088\h图58所示。图STYLEREF1\s5SEQ图\*ARABIC\s18每分钟访问量统计图转化率分析统计页面单跳转换率效果图如REF_Ref160466083\h图59所示。图STYLEREF1\s5SEQ图\*ARABIC\s19页面单跳转换率统计图订单分析以年龄、性别、地区为维度进行订单分析效果图如REF_Ref160466077\h图510所示。图STYLEREF1\s5SEQ图\*ARABIC\s110性别、年龄比例图统计订单取消原因分类效果图如REF_Ref160466073\h图511所示。图STYLEREF1\s5SEQ图\*ARABIC\s111订单取消原因比例图各品牌销售趋势效果图如REF_Ref160466068\h图512所示。图STYLEREF1\s5SEQ图\*ARABIC\s112品牌销售趋势图统计各地区订单分布量效果图如REF_Ref160466063\h图513所示。图STYLEREF1\s5SEQ图\*ARABIC\s113地区订单分布图本章小结本章主要聚焦于系统关键技术的实现。首先,我们详细介绍了系统开发所需的软硬件环境,为后续的技术实现提供了基础。随后,我们阐述了系统功能实现的具体流程,并对关键代码进行了深入解读。最后,我们展示了数据处理完成后的可视化结果,以直观地呈现系统的实际应用效果。总结与展望此章节对系统的运行进行了全面回顾,概述了当前部署状况,并对未来发展进行了展望。在当前企业用户行为数据迅猛增长的背景下,本系统深入研究并实施了用户行为分析策略。利用Hadoop进行海量数据的存储,通过Spark实现数据的离线与实时处理,最终将处理结果可视化,助力企业解决运营难题,推动产品发展。工作重点及未来规划主要包括:深入探讨用户行为分析系统及相关技术,如分布式存储和计算;分析企业数据增长趋势,选择合适的技术、进行需求分析和架构设计;实现系统核心功能,如日活跃用户分析、热门商品统计、订单来源分析、页面转化率统计;并关注性能优化,特别是shuffle环节的性能提升,涉及序列化、磁盘IO和网络数据传输等关键操作。在实现系统的过程中,也遇到过许多障碍,当程序运行时,会产生大量的缓存信息和消耗大量的内存,以及当程序异常停止时如何重新自启动,目前解决方案是通过“crontab”命令设置定时任务,每隔30分钟自动清理缓存以及检测程序和集群状态。在系统开发中,运用了许多大数据知识和技术,对大数据的理解和掌握也更进一步,日后,会继续完善此系统的文档和功能,使得处理数据更具有价值和参考能力。参考文献我国网民规模已达10.79亿人[J].信息系统工程,2023(9):封2.DOI:10.3969/j.issn.1001-2362.2023.09.002.盘和林,邓思尧,韩至杰.5G大数据[M].北京:中国人民大学出版社,2020.RanaG,SaharA,DouglasG.D,etal.Aclassificationofhadoopjobschedulersbasedonperformanceoptimizationapproaches[J].ClusterComputing,2021:1-23.孙康.基于Spark的电商用户行为分析系统的研究[D].辽宁:沈阳理工大学,2022.黄东升,郭崇.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论