使用Hive处理服务器日志

简介:

假设这样一个场景,用户有许多的机器(ECS或者自有机房的都可以),每天产生非常多的日志,记录了用户的访问的一些信息,比如userId,访问的页面地址,访问的时间,访问Ip等等。我们对这些数据进行一个离线分析,每天分析一次,计算网站的各个页面的UV、PV,并观察一下是否有作弊的情况:如多个不同的账号来自于同一个IP。并能将最终的这个结果同步到数据库中,在管理后台查看。

那么使用E-MapReduce要如何来做呢?

第一步 获取日志数据

首先,我们需要获取所有服务器的日志数据。这个可以通过阿里云的日志服务(SLS)来完成。
可以安装日志服务的客户端到指定的机器上,然后在日志服务的控制台进行数据收集配置,就能够把数据收集上来了。
具体的可以参考日志服务使用说明
你可以在配置中指定你需要收集的目录和文件名,通过这一步,所有的机器上的日志就都会被收集到日志服务中去。

第二步 将数据投递到OSS

收集到了数据。现在我们要把这些数据都放到OSS上去。主要是几个原因

  1. OSS的存储本身非常便宜,而日志服务默认数据并不永久保存
  2. 日志服务没有提供读取大量离线数据的接口

在LogStore管理标签下能够看到有一栏日志投递,如下
screenshot
点击对应的LogStore后面的OSS(创建),就可以创建一个到OSS的投递任务了
详细的配置参考,投递到OSS

其中有几点要注意的

  1. 投递的时候,是否压缩选项请选择非压缩的文本
  2. 是OSS投递的路径最终是这样构成的,会自动加上很多层的路径
    screenshot
  3. 所有的投递的数据都是一个json结构,并不是原始的数据格式

这个就需要我们在处理数据的时候,要对所有的目录进行遍历,并将数据做一次json解析,将最终要处理的数据内容取出来

第三步 使用Hive处理数据

这里假定,日志文件的内容是一个文本,对应到一个key叫content。里面的多个字段使用|来分割,保存到OSS中的数据类似如下的格式 {"content":"1463987545149|12345|121.164.16.19|www.xxxx.com/user"}

若使用emr-1.0.x或者emr-1.1.x,其中的Hive版本是1.0.1,使用下面的sql

CREATE EXTERNAL TABLE logtable (logcontent string) stored AS textfile location 'oss://{accesskeyId}: {accesskeysecret}@{bucketname}.{endpoint}/{dirname}/';
set hive.mapred.supports.subdirectories=true;
set mapreduce.input.fileinputformat.input.dir.recursive=true;
select get_json_object(logcontent, '$.content') as content from logtable limit 10000;

若使用emr-1.2.x或者emr-1.3.x,其中的Hive版本是2.0.0,使用下面的sql

CREATE EXTERNAL TABLE logtable (logcontent string) stored AS textfile location 'oss://{accesskeyId}: {accesskeysecret}@{bucketname}.{endpoint}/{dirname}/';
set mapreduce.input.fileinputformat.input.dir.recursive=true;
select get_json_object(logcontent, '$.content') as content from logtable limit 10000;

accesskeyId,accesskeysecret就是你的akid,和secret
bucketname是OSS对应的bucket的名字
dirname是投递到OSS的目录,因为设置了遍历所有目录,所以只要写这一级目录就可以了
endpoint的配置可以参考这里
get_json_object就是用来从json格式数据中将content这个key对应的内容取出来使用

接下来我们需要把要使用的字段都解析出来使用,比如UserId,Ip等等,我们使用分隔符|来对日志内容进行分割。
我这里是采用创建了一张新的表,而这张表的对应数据是保存在计算集群的HDFS上的

drop table if exists resulttable;
create table resulttable
  as
  select
    split(get_json_object(logcontent, '$.content'), "\\|")[0] as visit_time,
    split(get_json_object(logcontent, '$.content'), "\\|")[1] as user_id,
    split(get_json_object(logcontent, '$.content'), "\\|")[2] as visit_ip,
    split(get_json_object(logcontent, '$.content'), "\\|")[3] as visit_url 
  from logtable;

这张resulttable表就可以作为后续处理的起点,对数据进行各种统计,比如PV,UV等。

第四步 同步数据到Mysql

所有的数据计算完成以后,我们可以把结果同步到Mysql(RDS)中去。
要同步数据,请参考这里 使用Sqoop同步数据

目前同步数据还不是自动化的,后续E-MapReduce会有数据同步的作业支持,在计算完成以后,直接就进行数据同步。敬请期待。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
存储 运维 应用服务中间件
[运维日志] Web 服务器日志依日期归档(Powershell 实现,附源代码)
[运维日志] Web 服务器日志依日期归档(Powershell 实现,附源代码)
74 0
|
7月前
|
安全 Linux Perl
学会了如何查看Linux服务器日志,才敢说自己会Linux
学会了如何查看Linux服务器日志,才敢说自己会Linux
287 0
|
5月前
|
存储 关系型数据库 MySQL
CentOS7+Rsyslog+MySQL 搭建 Rsyslog 日志服务器
CentOS7+Rsyslog+MySQL 搭建 Rsyslog 日志服务器
127 0
|
3月前
|
JSON NoSQL 网络安全
业务服务器免装插件,使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1
业务服务器免装插件,使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1
39 0
|
3月前
|
运维 应用服务中间件 网络安全
利于群晖的File Station+SFTP实现第三方人员快速获取服务器应用日志
利于群晖的File Station+SFTP实现第三方人员快速获取服务器应用日志
69 0
|
3月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
49 0
|
5月前
|
运维 调度
日志服务器的那些坑
日志服务器的那些坑
31 0
|
5月前
|
监控 Java
游戏服务器的内存监控日志
游戏服务器的内存监控日志
60 0
|
6月前
|
应用服务中间件 Linux nginx
百度搜索:蓝易云【linux系统服务器,nginx日志切割保存教程。】
最后,确保定期检查和清理旧的日志文件,以免占用过多的磁盘空间。您可以使用crontab或其他定时任务工具来定期运行清理命令,例如删除超过一定时间的旧日志文件。
188 0
|
8月前
|
监控 算法 Unix
在Linux服务器上通过日志筛选技巧定位Spring Boot项目问题
在项目开发和维护的过程中,我们经常需要在 Linux 服务器上查询和分析日志文件。为了高效地处理大量的文本数据,我们可以借助一些强大的文本过滤工具,如 tail -f、more、zmore 和 grep。本文将介绍这些常用的 Linux 命令,帮助您在日志分析中更加得心应手。
149 0