赞
踩
当前互联网应用中,万维网(World Wide Web)应用占据了绝大部分的份额。万维网应用对外提供服务需要架设Web服务器软件。典型的Web服务器软件有Apache、Nginx等。Web服务器软件在运行过程中会写入各种日志到磁盘文件中。例如,Apache Web服务器软件运行过程中,会产生access.log文件,记录用户访问日志。
繁忙的Web服务器软件每天产生大量的日志记录。日积月累之后,这些日志所占据的存储会变得非常大。此时,单机无法满足分析处理日志的需求。因此,我们需要将日志文件存储在HDFS分布式文件系统中。使用开源的Apache Flume软件,能够从Web服务器集群导入日志到HDFS集群。
通过Apache Flume采集到HDFS的日志文件是原始的格式,这种格式通常并不利于分析统计。因此,下一步要做的是对日志文件进行预处理,产生更规整的数据。这个过程可以使用MapReduce来进行,从HDFS中读取原始日志文件,处理之后的数据仍然存放在HDFS上。
经过前面的准备,接下来可以对日志数据进行分析和统计了。最开始,人们直接使用MapReduce进行统计的工作。但是很快,大家发现编写MapReduce程序是一件很麻烦的事情,而且,部分数据分析人员不具备Java编程的能力。为了解决这个问题,Apache Hive软件被创建出来。借助Apache Hive,可以使用SQL语言读写和管理HDFS上的数据。在本次实践的最后一个环节,你将使用Apache Hive,对预处理之后的规整数据进行分析统计。
总体流程架构如图:
日志文件数据是某个高校WWW服务器七个月的HTTP请求数据 (时间是从1995/6/1 00:00:00到1995/12/31 23:59:59)。日志数据分别存在文件xaa、xab、xac中,首先将它保存到/home/ubuntu/com_experiment目录中。
1. 启动hadoop进行实验操作:
hadoop namenode -format
start-all.sh
jps
成功启动如图:
2. 在/home/ubuntu目录下创建flume.conf文件,内容配置如下(注:本地路径与hdfs路径):
# Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1 # 定义源: spooldir a1.sources.r1.type = spooldir # 指定监控目录(本地路径) a1.sources.r1.spoolDir = /home/ubuntu/com_experiment a1.sources.r1.decodeErrorPolicy = IGNORE # Describe the sink(hdfs路径) a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = /flume/20220706/ a1.sinks.k1.hdfs.fileType = DataStream a1.sinks.k1.hdfs.useLocalTimeStamp = true a1.sinks.k1.hdfs.rollSize = 0 a1.sinks.k1.hdfs.rollCount = 0 # Use a channel which buffers events in memory a1.channels.c1.type = memory # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
3. 运行flume配置的命令,代码如下:
flume-ng agent -f /home/ubuntu/flume.conf -n a1
运行结果如图:
Apache Flume是一种分布式的可靠的系统,主要用于高效地收集、聚合和移动大量来自不同来源的日志数据到一个集中的数据存储区。可以通过运行“flume-ng -h”了解上述命令各选项的含义。
4. 日志导入到HDFS后,查看HDFS目录下某个文件的前几条内容:
#查看HDFS目录内容的命令
hdfs dfs -ls /flume/20220706
HDFS目录内容部分如图:
#查看HDFS目录下某文件的前几行内容的命令
hdfs dfs -cat /flume/20220706/FlumeData.1657070180143 | head -n 3
查看HDFS目录下某文件的前三行内容如图:
日志文件导入HDFS之后,为了方便Hive加载和分析数据,需要进一步对日志文件进行预处理,产生格式整齐的数据文件。
原日志示例如图:
这是典型的Apache服务器软件的日志格式。每一行记录用户对Web服务器的一次访问。一条记录有七个栏位,各栏位之间使用空格字符分隔。各栏位的含义如下:
- 远程主机IP:该栏是请求的请求方IP地址。其示例值为:131.235.141.48。
- E-mail:该栏现在已经弃用,其值恒为“-”。
- 登录名:该栏现在已经弃用,其值恒为“-”。
- 请求时间:该栏是接收到请求的时间。时间信息用方括号包围,而且采用所谓的 “公共日志格式” 或 “标准英文格式” 。时间信息最后的 “-0600” 表示服务器所处时区位于UTC之前的6小时。
- HTTP请求信息:该栏是典型的 ”METHOD RESOURCE PROTOCOL” ,即 ”方法 资源 协议”。METHOD是一般浏览器通过GET或POST方法来传输表单信息,RESOURCE是指浏览者向服务器请求的文档地址,即URL。PROTOCOL通常是HTTP,后面再加上版本号。
- 状态代码:该栏是请求信息的状态。一般地说,以2开头的状态代码表示成功,以3开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置,以4开头的状态代码表示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个错误。
- 发送字节数:该栏是发送给客户端的总字节数。通过检查该数值是否和实际文件的大小相同,可以知道这次传输是否被打断。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。其示例值为:2273。
日志处理后示例如图:
作出的处理如下:
- 丢弃第2栏和第3栏
- 第5栏—HTTP请求信息拆分为三个字段,分别表示:方法、资源、协议
- 将文件转换为csv格式,即每个字段之间使用英文逗号分隔
其中输入是Flume导入到HDFS的目录,输出结果存放于HDFS的另外一个目录。
1.了解到日志数据需要如何处理后,使用MapReduce进行处理,只需map即可,代码如下:
#路径/home/ubuntu/map.py
import sys
import csv
with open("Output.csv",'w',encoding='utf-8',newline="") as file:
for line in sys.stdin:
if line[0] != '':
line = line.strip()
line = line.replace('- - ', '').replace('[', '').replace(']', '').replace('"', '').replace('"', '')
line = line
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。