天天看点

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

目录

​​基于Hadoop部署实践对网站日志分析​​

​​1.项目概述​​

​​2.安装及部署​​

​​2.1 VMware安装​​

​​2.2 Ubuntu安装​​

​​ 2.3 Java环境安装​​

​​2.4 Hadoop安装​​

​​2.5 MySQL安装​​

​​ 2.5 hive安装​​

​​ 2.6 sqoop安装​​

​​2.7 hbase安装​​

​​3.数据预处理​​

​​3.1 使用MapReduce编写程序​​

​​3.2 数据及环境准备​​

​​3.3 MapReduce执行​​

​​4.数据导入hive​​

​​4.2按日期创建分区​​

​​5.数据分析​​

​​5.1 PV量​​

​​5.2注册用户数​​

​​5.3 独立IP数​​

​​5.4 跳出用户数​​

​​6.导入MySQL​​

​​6.1创建mysql表​​

​​6.2 将hive结果文件导入mysql​​

​​7.附加操作—增添色彩​​

​​7.1 本地Navicat连接​​

​​7.2 数据可视化(项目色彩一)​​

​​7.3 将数据导入到hbase(项目色彩二)​​

​​每文一语​​

基于Hadoop部署实践对网站日志分析

1.项目概述

本次要实践的数据日志来源于国内某技术学习论坛,该论坛由某培训机构主办,汇聚了众多技术学习者,每天都有人发帖、回帖。至此,我们通过Python网络爬虫手段进行数据抓取,将我们网站数据(2013-05-30,2013-05-31)保存为两个日志文件,由于文件大小超出我们一般的分析工具处理的范围,故借助Hadoop来完成本次的实践。利用hdfs将我们的数据上传到分布式文件系统,最后利用MapReduce进行数据清洗,然后导入到hive进行数据分析统计,最后利用sqoop导出到MySQL,然后进行数据可视化展示。

2.安装及部署

首先我们获取到Hadoop部署所需的各类安装包及镜像文件,包含VMware15.5,Ubuntu18.04.5,Hadoop,hive,sqoop,MySQL,hdfs,如下

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

图表 1 Hadoop插件详情

2.1 VMware安装

本次实验我们安装的是VMware15.5版本的,它是我们虚拟环境的一个基础,像Linux、Ubuntu这些虚拟环境都是在此基础上搭建的,安装过程这里就不详细的展出了,最终的安装结果如下。

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

2.2 Ubuntu安装

       首先安装一个Ubuntu系统,用于我们所有的环境搭建,在此基础上我们可以搭建我们的Hadoop集群,还可以在这里面进行我们Windows系统可以进行的操作,例如上网、办公等,Ubuntu安装最终结果如下。

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

2.3 Java环境安装

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

2.4 Hadoop安装

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

图表 5 Hadoop环境变量添加

首先开启Hadoop集群:start-all.sh:开启所有的Hadoop所有进程,在主节点上进行

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

各节点的参数解释如下:

①NameNode它是Hadoop 中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问。

②Secondary  NameNode是一个用来监控HDFS状态的辅助后台程序。

③DataNode它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个 datanode 守护进程。

④NodeManager:

1、是YARN中每个节点上的代理,它管理Hadoop集群中单个计算节点

2、包括与ResourceManger保持通信,监督Container的生命周期管理,

3、监控每个Container的资源使用(内存、CPU等)情况,追踪节点健

4、康状况,管理日志和不同应用程序用到的附属服务(auxiliary service)

⑤ResourceManager:在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)RM与每个节点的NodeManagers (NMs)和每个应用的ApplicationMasters (AMs)一起工作。

2.5 MySQL安装

   首先,在进行MySQL安装的时候,我们需要保证我们的虚拟机处于连接网络的状态。执行该命令对MySQL服务安装:sudo apt-get install mysql-server

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

2.5 hive安装

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

Show databases;展示数据库的名称

Show tables;展示所有表

Create table 表名(字段 字段类型……) 创建表结构

2.6 sqoop安装

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

2.7 hbase安装

虽然本次实验项目用不到hbase,但是我的附加项目里面,包含了hbase的相关操作,这里也给出安装结果截图

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

至此我们的所有插件及环境都已经安装部署完毕了,接下来就是我们的项目实践。这里并没有给出安装的每一步,但是在我的博客里面已经给出了详细的安装步骤了

3.数据预处理

通过一些技术手段,对我们所获取到底层数据进行数据转换和数据清洗,最终统一我们的数据格式,让我们的数据变得更加便于我们数据分析和展示。本次的实验数据,是网站的日志数据,其中每行记录有5部分组成:访问者IP、访问时间、访问资源、访问状态(HTTP状态码)、本次访问流量。需要我们利用Hadoop的MapReduce对我们的数据进行清洗,最终转换为我们所需要的干净数据,最终只需要三种字段:访问IP、访问时间、访问资源,其中需要让它们按照逗号进行分割,数据格式及内容需要规整。

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

图表 11 原数据内容展示

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

图表 12 预处理内容展示

3.1 使用MapReduce编写程序

   使用python开发的mapper reducer进行数据处理。这一步需要两个Python文件,两个执行文件,两个日志文件,Python文件用于对我们的源数据进行处理和清洗,执行文件包含了输入输出,这样可以加强我们实验的编程性。

Hadoop Streaming是Hadoop提供的一种编程工具,允许用户用任何可执行程序和脚本作为mapper和reducer来完成Map/Reduce任务,这意味着你如果只是hadoop的一个轻度使用者,你完全可以用Hadoop Streaming+Python/Ruby/Go 等任何你熟悉的语言来完成你的大数据探索需求,又不需要写上很多代码。

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

3.2 数据及环境准备

  3.2.1 源数据文件准备

   - 下载日志文件

   - 将文件拷贝到hadoopvm虚拟机

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

图表 14 数据源展示

记住虚拟机上本地路径如:/home/hadoop/logfiles/

sudo find / -name hadoop-stream*(找到Hadoop文件路径)

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

图表 15 Hadoop jar包路径

将Python脚本里面的参数和路径替换,刚刚找到的替换第一行

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

在hdfs里面新建我们的文件夹:logfiles,然后把我们的日志文件放入里面

   - 将文件使用hdfs命令上传到HDFS

先创建hdfs路径:

参数解释:创建文件时候mkdir -p (创建多级目录,父目录存在不报错,依旧在此目录创建没有的子目录)

hdfs dfs -mkdir -p /user/hadoop/logfiles

再上传文件到hdfs

参数解释:

put命令把本地的文件上传到hdfs里面

命令为put 本地路径 hdfs路径

ls -R 递归显示该目录下的所有文件夹(文件)属性和信息

hdfs dfs -put access_2013_05_30.log /user/hadoop/logfiles

hdfs dfs -put access_2013_05_31.log /user/hadoop/logfiles

hdfs dfs -ls -R /user/hadoop/logfiles

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

使用python开发mapreduce脚本对日志数据进行清理,目的是将平面的文本数据解析关键字段成结构化数据,以便存入结构化数据库hive进行分析。

3.3 MapReduce执行

   - mapper程序

  拷贝到hadoopvm虚拟机,记住路径如:/home/hadoop/logfiles/format_mapper.py

   - reduce程序

  拷贝到hadoopvm虚拟机,记住路径如:/home/hadoop/logfiles/format_reducer.py

   - 使用hadoop-streaming运行mapper reducer程序,示例:

   - 修改python程序文件的执行权限:

参数解释:

cd 切换到该路径下,cd ~ :切换到家目录,cd .. 切换到上一级的目录

Chmod 给我们的文件加入权限;数字为777 代表可读可写可执行

详解:

r (read)      ---------------->   4

w (write)    ---------------->   2

x (excute)    ---------------->   1

或者

u user 表示该文件的所有者
g group 表示与该文件的所有者属于同一组( group )者,即用户组
o other 表示其它用户组
a all 表示这三者皆是

chmod u+rwx, g+rwx, o+rwx filename 改命令说明对filename文件, 赋予user、group、other均有read、write、excute的权限

cd /home/hadoop/logfiles/

chmod 777 format_mapper.py

chmod 777 format_reducer.py

chmod 777 format_run_2013-05-30.sh

chmod 777 format_run_2013-05-31.sh

   -执行脚本文件:

cd /home/hadoop/logfiles/

source format_run_2013_o5_30.sh

source format_run_2013_o5_31.sh

执行我们的脚本文件,可以用source或者./

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

-查看数据清洗的文件

hdfs dfs -ls -R /user/hadoop

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

- 结果文件(查看)

参数解释

cat 查看文件里面的内容,这个是全部查看,还有其他的查看命令:cat主要有三大功能:

1.一次显示整个文件。

cat   filename

2.从键盘创建一个文件。

cat  >  filename

只能创建新文件,不能编辑已有文件.

3.将几个文件合并为一个文件。

cat   file1   file2  > file

Hdfs dfs -cat /user/Hadoop/files30/part-00000

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

4.数据导入hive

创建hive数据库,将处理的数据导入hive数据库

4.1 根据结果文件结构建立hive数据库表

   3.4.1在结果文件上创建分区表

   - 表名 (techbbs)

   - 表类型 (External)

   - 表字段

    字段名    字段类型    描述

    ip           string    访客IP地址

    atime     string    访问时间

    url          string    访问页面

   - 表分区字段 (logdate string)

   - 表分隔符 (TERMINATED BY ‘,’)

   - 表路径 (LOCATION /xxx/xxx)

首先把清洗后的文件放在我们自己设定的文件夹里面

参数解释

MV 移动或者剪切 使用格式:MV 源文件 目标路径最后也可以对其进行重命名,如果不加/那么就是重命名,加了就是把其粘贴在该路径下面

hdfs dfs -mkdir -p /user/hadoop/data/datas

hdfs dfs -mkdir -p /user/hadoop/data/datas1

hdfs dfs -mv /user/hadoop/files30/part-00000 /user/hadoop/data/datas/30

hdfs dfs -mv /user/hadoop/files31/part-00000 /user/hadoop/datas/datas1/31

hdfs dfs -ls -R /user/hadoop/data      
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

 在hive里面进行创建表格,这里创建一个分区表,create external table 表名(字段 字段类型……)partitioned by (分区字段 字段类型) rowformat delimted fields terminated by ‘分割符’,location 数据路径的祖文件夹(不包含数据的直接存储文件夹)

建表语句:

CREATE EXTERNAL TABLE wxw(ip string, atime string, url string) PARTITIONED BY (logdate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/hadoop/data';      

截图:

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

4.2按日期创建分区

建立分区语句

语法解释:

Alter table 表名 add partition(分区字段=‘分区标签’)location 数据路径(数据文件的父文件夹)

ALTER TABLE wxw ADD PARTITION(logdate='2013_05_31') LOCATION '/user/hadoop/data/datas1';      
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
ALTER TABLE wxw ADD PARTITION(logdate='2013_05_31') LOCATION '/user/hadoop/data/datas1';      
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】
☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

数据导入成功! 

5.数据分析

使用Hive对结果表进行数据分析统计

5.1 PV量

创建一个表使用create,这里我们把查询出来的数据,直接创建一个视图,select count(1) 统计数量,这里的语法意思就是,统计日期为2013-05-30(2013-05-31)的日志记录数量,也就是PV(浏览量)

语句:

CREATE TABLE wxw_pv_2013_05_31 AS SELECT COUNT(1) AS PV FROM wxw WHERE logdate='2013_05_31';      

语句:

CREATE TABLE wxw_pv_2013_05_31 AS SELECT COUNT(1) AS PV FROM wxw WHERE logdate='2013_05_31';      

5.2注册用户数

这里使用一个hive里面的函数:instr(源字符串,匹配字符串),通过给定一个字符串,然后利用匹配字符串的整体,返回匹配字符串的第一个字符在源字符串的索引位置。所以该语句就是有两个条件,分别是日期和个函数所匹配到的结果,如果有这个网址那么就是返回一个索引(大于0的)

语句:

CREATE TABLE wxw_reguser_2013_05_30 AS SELECT COUNT(1) AS REGUSER FROM wxw WHERE logdate = '2013_05_30' AND INSTR(url,'member.php?mod=register')>0;      

语句:

CREATE TABLE wxw_reguser_2013_05_31 AS SELECT COUNT(1) AS REGUSER FROM wxw WHERE logdate = '2013_05_31' AND INSTR(url,'member.php?mod=register')>0;      

5.3 独立IP数

独立IP数,这里直接对我们的IP字段进行去重处理,这样就可以显示IP的独立数量了

语句:

CREATE TABLE wxw_ip_2013_05_30 AS SELECT COUNT(DISTINCT ip) AS IP FROM wxw WHERE logdate='2013_05_30';      

语句:

CREATE TABLE wxw_ip_2013_05_31 AS SELECT COUNT(DISTINCT ip) AS IP FROM wxw WHERE logdate='2013_05_31';      

5.4 跳出用户数

跳出用户数:只浏览了一个页面便离开了网站的访问次数,即只浏览了一个页面便不再访问的访问次数。这里,我们可以通过用户的IP进行分组,如果分组后的记录数只有一条,那么即为跳出用户。将这些用户的数量相加,就得出了跳出用户数。

先对IP进行分组,然后使用having进行过滤 过滤这个分组里面只有一条记录的条数,最后进行计数,就得到了我们的跳出用户数量

语句:

create table wxw_jumper_2013_05_30 as select count(1) as jumper from (select count(ip) as times from wxw where logdate='2013_05_30' group by ip having times=1) e;      

语句:

create table wxw_jumper_2013_05_31 as select count(1) as jumper from (select count(ip) as times from wxw where logdate='2013_05_31' group by ip having times=1) e;      

将所有的查询放在一张表里:

set hive.mapred.mode=nonstrict;(解决多表连接的问题)

语法解释:

内连接表示查询两个表的交集,而且ON的条件为 1=1 就表示连接条件永远成立,这里使用将所有的查询结果汇总到一张数据表里面

语句:

create table wxw_2013_05_30 as select '2013_05_30',a.pv,b.reguser,c.ip,d.jumper from wxw_pv_2013_05_30 a join wxw_reguser_2013_05_30 b on 1=1 join wxw_ip_2013_05_30 c on 1=1 join wxw_jumper_2013_05_30 d on 1=1;

select * from wxw_2013_05_30;      

语句:

create table wxw_2013_05_31 as select '2013_05_31',a.pv,b.reguser,c.ip,d.jumper from wxw_pv_2013_05_31 a join wxw_reguser_2013_05_31 b on 1=1 join wxw_ip_2013_05_31 c on 1=1 join wxw_jumper_2013_05_31 d on 1=1;

select * from wxw_2013_05-31;      

6.导入MySQL

使用Sqoop将hive分析结果表导入mysql

6.1创建mysql表

mysql -u root -p(启动MySQL,需要输入密码,不显示)

create database wxw;(创建数据库)      

创建一个表格

create table wxw_logs_stat(logdate varchar(10) primary key,pv int,reguser int,ip int,jumper int);      

6.2 将hive结果文件导入mysql

查看hive存放的表位置

show create table wxw_2013_05_30;      

语法解释:

使用sqoop将我们的hive里面的结果表导入到我们的MySQL里面,使用sqoop export –connect jdbc:mysql://localhost:3306/数据库 –username root -p –table MySQL里面的表名 –export-dir hive里面结果表的存储位置 -m 1 –input -fields-terminated -by ‘\001’

语句:

sqoop export --connect jdbc:mysql://localhost:3306/wxw --username root -P --table wxw_logs_stat --export-dir  /opt/hadoop/hive/warehouse/data.db/wxw_2013_05_30  -m 1 --input-fields-terminated-by '\001'      

语句:

sqoop export --connect jdbc:mysql://localhost:3306/wxw --username root -P --table wxw_logs_stat --export-dir  /opt/hadoop/hive/warehouse/data.db/wxw_2013_05_31  -m 1 --input-fields-terminated-by '\001'      

查看MySQL是否导入成功

select * from wxw_logs_stat;      

7.附加操作—增添色彩

7.1 本地Navicat连接

(我们用虚拟机里面的IP来连接我们的本地Navicat,这样有助于我们数据分析可视化!)

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

7.2 数据可视化(项目色彩一)

数据可视化可以直观的把我们的数据展现出来,作为领导者决策的重要参考意见

我采用pycharm的pymysql对虚拟机里面的MySQL进行远程连接,通过编程对数据可视化一键展示,不需要我们手动的添加数据,直接可以保存变量数据

☀️从0到1部署Hadoop☀️基于网站日志进行大数据分析【❤️建议收藏❤️】

简单的数据分析:很明显我们可以通过可视化的效果得知,2013-05-31的浏览量、注册用户、独立IP数这些正向指标都比较的好,都是高于2013-05-30的效果,所以我们可以在这一天对网站加大维护和投入相应的广告来盈利。

可视化代码如下:

from pyecharts.globals import ThemeType
from pyecharts import options as opts
from pyecharts.charts import Bar
import pymysql
conn = pymysql.connect(
                host='192.168.190.135',
                user='root',
                password='2211',
                database='wxw',
                port=3306,
                charset='utf8'
)
cur = conn.cursor()
sql = 'select logdate as `日期`,pv as `浏览量`,reguser as `注册用户数`,ip as `独立IP数量`,jumper as `跳出用户数` from `wxw_logs_stat`;'
cur.execute(sql)
data = cur.fetchall()
print(data)
x_1=list(data[0][1:])
x_2=list(data[1][1:])
print(x_1)
print(x_2)
a=[]
for x in data:
    a.append(x[0])
a_1=a[0]
a_2=a[1]
print(a_1)
print(a_2)
conn.close()

data_0=['浏览量', '注册用户', '独立IP数', '跳出用户数']
c = (
    Bar({"theme": ThemeType.MACARONS})
    .add_xaxis(data_0)
    .add_yaxis(a_1, x_1)    #gap="0%"   这个可设置柱状图之间的距离
    .add_yaxis(a_2, x_2)    #gap="0%"   这个可设置柱状图之间的距离
    .set_global_opts(title_opts={"text": "某网站日志数据分析", "subtext": "柱状图"},     #该标题的颜色跟随主题
                     # 该标题默认为黑体显示,一般作为显示常态
                     # title_opts=opts.TitleOpts(title="标题")
                     xaxis_opts=opts.AxisOpts(
                         name='类别',
                         name_location='middle',
                         name_gap=30,  # 标签与轴线之间的距离,默认为20,最好不要设置20
                         name_textstyle_opts=opts.TextStyleOpts(
                             font_family='Times New Roman',
                             font_size=16  # 标签字体大小
                         )),
                     yaxis_opts=opts.AxisOpts(
                         name='数量',
                         name_location='middle',
                         name_gap=60,
                         name_textstyle_opts=opts.TextStyleOpts(
                             font_family='Times New Roman',
                             font_size=16
                             # font_weight='bolder',
                         )),

                    # datazoom_opts=opts.DataZoomOpts(type_="inside"),  #鼠标可以滑动控制
                     # toolbox_opts=opts.ToolboxOpts()  # 工具选项
                    # brush_opts=opts.BrushOpts()       #可以保存选择
    )

    .render("简单柱状图.html")
)
print("图表已生成!请查收!")      

7.3 将数据导入到hbase(项目色彩二)

创建数据表和列族:create 'wxw','data'

插入数据:

Put 'wxw','1','data:londate,pv,reguser,jumper','2013-05-30,69857,28,10411,3749'

put 'wxw','2','data:londate,pv,reguser,jumper','2013-05-31,502404,523,24635,8454'      

参数说明:添加数据:put ‘表名称’,’行键’,’列族:列名1,列名2……’,‘数据1,数据2……’在这里我们就可以理解为是一个二维表,也就是Excel类似的,一行一列确定一个单元格

每文一语

继续阅读