大数据实战项目 您所在的位置:网站首页 用户行为模型分析案例 大数据实战项目

大数据实战项目

2024-07-13 11:24| 来源: 网络整理| 查看: 265

一、实验目的

1. 掌握关系数据库的原理、MySQL数据库的安装和使用方法;

2. 掌握IntelliJ IDEA编写Scala程序的方法;

3. 掌握编写Spark程序的方法;

4. 掌握使用Spring框架进行网页开发的方法;

5. 掌握通过网页进行数据可视化的方法。

二、实验内容

相关数据集、源码链接:高校大数据实训课程系列案例之电信用户行为分析_厦门大学数据库实验室

1. 把电信用户行为数据集加载到HDFS中;

2. 使用Scala或Python语言编写Spark程序对HDFS中的数据进行用户行为分析,并把结果写入到MySQL数据库;

3. 使用Spring MVC框架开发网页应用,对MySQL数据库中的数据进行可视化分析;

4. 在网页中以图表形式对分析结果进行可视化呈现。

三、实验要求

1. 实验完成度。 按要求独立完成实验准备、程序调试、实验报告撰写。

2. 实验内容。代码功能完善、可正常运行,测试数据正确,分析正确,结论正确。

3. 实验报告。内容齐全,符合要求,包括代码的规范性、注释的完整性、算法和模型的优化程度等。

4. 总结。对实验过程遇到的问题能初步独立分析,解决后能总结问题原因及解决方法,有心得体会。

四、实验过程、详细步骤 3.1本地数据集上传到HDFS 3.1.1 数据集下载

本案例采用一个电信行业用户数据demo.txt。

3.1.2 把数据集上传到HDFS

# 进入Hadoop安装目录

~$ cd /usr/local/hadoop

# 启动Hadoop的HDFS组件

/usr/local/hadoop$ ./sbin/start-dfs.sh

# 查看HDFS的相关进程是否正常启动

/usr/local/hadoop$ jps

4034 NameNode

9958 NailgunRunner

9110 RemoteMavenServer

11711 Jps

# 查看HDFS文件系统目录下的内容

/usr/local/hadoop$ ./bin/hdfs dfs -ls /

# 在HDFS的根目录下创建input_spark目录

/usr/local/hadoop$ ./bin/hdfs dfs -mkdir /input_spark

# 查看目录是否要创建成功

/usr/local/hadoop$ ./bin/hdfs dfs -ls /

drwxr-xr-x   - hadoop supergroup          0 2023-06-02 12:46 /input_spark

# 把本地数据集上传到HDFS中

/usr/local/hadoop$ ./bin/hdfs dfs -put ~/Downloads/demo.txt /input_spark

# 查看该目录的信息

/usr/local/hadoop$ ./bin/hdfs dfs -ls /input_spark

# 查看HDFS文件中的数据

/usr/local/hadoop$ ./bin/hdfs dfs -cat /input_spark/demo.txt

3.2 在MySQL中创建数据库 3.2.1启动进入MySQL Shell环境

# 启动MySQL服务

/usr/local/hadoop$ service mysql start

# 进入MySQL

/usr/local/hadoop$ sudo mysql -u root -p

3.2.2创建一个数据库

create database spark_web;

# 进入数据库spark_web

use spark_web

3.2.3创建一个数据库汇总表 create table sum ( imei varchar(10) default null comment'用户编号', log_times int(2) default null comment'登陆次数', online_time int(10) default null comment'在线时长(秒)' ) engine=innodb default charset=utf8;

3.2.4创建一个数据明细表 create table detail ( imei varchar(10) default null comment'用户编号', log_times int(2) default null comment'登陆次数', online_time int(10) default null comment'在线时长(秒)' ) engine=innodb default charset=utf8;

3.2.5创建一个数据原始明细表 create table cleanMap ( imei varchar(10) default null comment'用户编号', logid varchar(100) default null comment'登录时间', requestip varchar(11) default null comment'登录IP地址', areacode varchar(11) default null comment'登录区域', requesttype varchar(11) default null comment'请求类型', channelne varchar(11) default null comment'渠道' )engine=innodb default charset=utf8;

3.2.6 创建一个区域维表 create table t_dim_area ( areacode varchar(11) default null comment'区域编码', areaname varchar(100) default null comment'区域名称' )engine=innodb default charset=utf8;

3.2.7 创建一个渠道维表 create table t_dim_channel ( channelno varchar(11) default null comment'渠道编号', channelname varchar(100) default null comment'渠道名称' )engine=innodb default charset=utf8 row_format=dynamic; insert into t_dim_channel values ('0','手机'); insert into t_dim_channel values ('1','PC'); insert into t_dim_channel values ('2','平板电脑');

3.2.8创建一个请求维表 create table t_dim_requesttype ( requesttype varchar(11) default null comment'请求类型', requesttypename varchar(100) default null comment'请求类型名称' )engine=innodb default charset=utf8 row_format=dynamic; insert into t_dim_requesttype values ('0','GET方式'); insert into t_dim_requesttype values ('1','POST方式');

3.2.9创建一个五个视图 # 用户渠道趋势分析 create or replace view v_area_channel as select b.areaname,c.channelname,count(distinct imei) num from cleanMap a,t_dim_area b,t_dim_channel c where a.areacode=b.areacode and a.channelne=c.channelno group by b.areaname,c.channelname; # 用户请求类型对比情况 create or replace view v_area_requesttype as select b.areaname,c.requesttypename,count(distinct imei) num from cleanMap a,t_dim_area b,t_dim_requesttype c where a.areacode=b.areacode and a.requesttype=c.requesttype group by b.areaname,c.requesttypename; # 用户渠道饼图分析 create or replace view v_channelno as select b.channelname,count(distinct imei) num from cleanMap a,t_dim_channel b where a.channelne=b.channelno group by b.channelname; # 用户登录情况分析 create or replace view v_user_login as select distinct a.imei,a.log_times,b.first_login_time,a.online_time from sum a,detail b where a.imei=b.imei; # 用户详细情况分析 create or replace view v_user_detail as select distinct a.imei,a.requestip,d.requesttypename,c.first_login_time, b.log_times,b.online_time,e.areaname,f.channelname from cleanMap a,sum b,detail c,t_dim_requesttype d,t_dim_area e,t_dim_channel f where a.imei=b.imei and a.imei=c.imei and a.requesttype=d.requesttype and a.areacode=e.areacode and a.channelne=f.channelno;

3.2.10添加MySQL数据库驱动程序JAR包

/usr/local/hadoop$ cd ~/下载

~/下载$ unzip mysql-connector-java-5.1.40.zip

~/下载$ cp ./mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/spark/jars

3.3 开发Spark程序分析用户行为 3.3.1 新建项目Spark_Web

项目Spark_Web的目录结构如下。

3.3.2 运行Spark_Web项目

3.3.3 生成Spark_Web.jar

生成jar包的途径是“~/IdeaProjects/Spark_Web/out/artifacts/Spark_Web_jar/Spark_Web.jar”

3.3.4 使用spark-submit命令运行程序

# 启动MySQL

$ service mysql start

$ mysql -u root -p

3.3.5 执行Spark_Web.jar程序 $ cd /usr/local/spark $./bin/spark-submit --class "cn.edu.xmu.UserOnlineAnalysis" --driver-class-path :/usr/local/spark/jars/* ~/IdeaProjects/Spark_Web/out/artifacts/Spark_Web_jar/Spark_Web.jar file:///home/hadoop/Downloads/demo.txt

执行结束后,在MySQL Shell交互式执行环境中,执行如下SQL命令语句。

show database; use spark_web; show tables; select * from detail; select * from sum; select * from cleanMap;

3.4 使用Spring MVC框架进入数据可视化分析 3.4.1 新建项目SpringMVC

项目Spark_Web的目录结构如下。

3.4.2 生成应用程序JAR包

3.4.3 把网页应用部署到Tomcat服务器中

进人Tomcat安装目录(即“/usr/local/tomcat"), 再进入conf子目录,打开“server.xml" 文件,修改配置文件。

然后,保存“server.xml”文件,在Linux终端中继续执行如下Shell命令,重新启动Tomcat 服务器:

$ cd /usr/local/tomcat

$./bin/shutdown.sh

$./bin/startup.sh

前面已经生成的SpringMVC.war 文件的路径是

“~/ldeaProjects/SpringMVC/out/artifacts/SpringMVcSpringMVC.war”。把“SpringMVC.war”文件复制到 Tomcat 的安装目录的“webapps”目录下(即“usr/local/tomcat/webapps”目录)。如图6-47所示,当把“SpringMVC.war”文件复制到webapps目录下的时候,Tomcat 会自动在该目录下生成文件夹 SpringMVC。实际上,如果后面要修改网页程序,当把 webapps目录下的“SpringMVC.war”文件删除时,Tomcat也会自动删除SpringMVC目录。

打开Linux系统的浏览器,在浏览器输人地址“http:/localhost:9999/charts”。就可以看到最终的数据图表了。

在“用户渠道趋势分析”可视化图表的右侧,可以单击“用户数”这一列中的数字,会出现一个新的页面显示具体用户信息。

3.5 总结

本章首先简要介绍了本案例的数据分析整体过程;然后描述了数据集的特性,并讨论了把本地数据集加载到 HDFS 中的方法;接下来,通过SQL 语句,在MySQL 数据库中创建了相应的数据库、表和视图,用于存储Spark程序的数据分析结果;再然后,详细介绍了使用Scala语言编写Spark程序分析用户行为的细节过程;最后,使用Spring、 Spring MVC、MyBatis框架和可视化图表库ECharts编写网页应用程序,在网页中以图表形式对分析结果进行可视化呈现。

四、实验结果(运行结果截图)

实验结果如上述!!!

五、总结与思考

(列出遇到的问题和解决办法,列出没有解决的问题,可以是个人相关知识点总结,要求300字以上)

总结通过本次实验掌握的相关知识点与心得体会,及实验过程中得到的各方面收获(知识面拓展、实践动手能力、数据认识、交流互动……)。

Spring框架中的单例Bean是线程安全的么?

Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。

如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

· 有状态就是有数据存储功能

· 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。

Dao会操作数据库Connection,Connection是带有状态的,比如说数据库事务,Spring的事务管理器使用Threadlocal为不同线程维护了一套独立的connection副本,保证线程之间不会互相影响(Spring是如何保证事务获取同一个Connection的?)

不要在bean中声明任何有状态的实例变量或类变量,如果必须如此,那么就使用ThreadLocal把变量变为线程私有的,如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用synchronized、lock、CAS等这些实现线程同步的方法了。

Spring容器初始化流程?

(1)将xml或者注解等配置信息读取到内存中

(2)在内存中这些配置文件会当作Resource对象

(3)之后会将Resource对象解析成BeanDefination实例

(4)最后将BeanDefination注册到容器中

DefaultListableBeanFactory :存储容器中所有已经注册的BeanDefination的载体

Spring 中的 bean 生命周期?

Spring中Bean的生命周期主要在创建和销毁两个时期。

创建过程:

(1)实例化bean对象,以及设置bean属性

(2)如果通过Aware接口声明了依赖关系,则会注入Bean对容器基础设施层面的依赖,Aware接口是为了感知到自身的一些属性。

(3)紧接着会调用BeanPostProcess的前置初始化方法postProcessBeforeInitialization,主要作用是在Spring完成实例化之后,初始化之前,对Spring容器实例化的Bean添加自定义的处理逻辑。有点类似于AOP。

(4) 如果实现了BeanFactoryPostProcessor接口的afterPropertiesSet方法,做一些属性被设定后的自定义的事情。

(5) 调用Bean自身定义的init方法,去做一些初始化相关的工作。

(6) 调用BeanPostProcess的后置初始化方法,postProcessAfterInitialization去做一些bean初始化之后的自定义工作。

(7) 完成以上创建之后就可以在应用里使用这个Bean了。

**销毁过程:**当Bean不再用到,便要销毁

(1)若实现了DisposableBean接口,则会调用destroy方法;

(2)若配置了destry-method属性,则会调用其配置的销毁方法;

大致分为五个阶段:

·创建前准备

实例化

依赖注入

容器缓存

实例销毁

注意区分:

实例化:是对象创建的过程。比如使用构造方法new对象,为对象在内存中分配空间。

初始化:是为对象中的属性赋值的过程。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有