博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Data Lake Analytics快速分析OSS上的日志文件
阅读量:6296 次
发布时间:2019-06-22

本文共 8929 字,大约阅读时间需要 29 分钟。

背景

(后文简称 DLA)是Serverless化的云上交互式查询分析服务,用户可以通过标准的SQL语句对存储在OSS, OTS, RDS等介质上的数据进行快速地查询分析。

日志文件在大数据分析中的地位举足轻重。对于一个服务来说,其日志文件往往记录了其运行的所有详细信息。无论是故障排除,状态监控,还是预测告警,都离不开对日志文件的查询分析。由于OSS的高性价比,越来越多的用户倾向把大量的日志文件存储在OSS中。DLA可以无需移动OSS上的日志文件,直接对其做查询分析。

本文将介绍如何使用DLA对常见格式的日志文件做查询。

使用DLA查询日志文件

DLA可以分析的日志文件需要满足下面的条件:

  1. 日志文件是纯文本的格式,每行可以映射为表中的一条记录;
  2. 每行的内容有固定的模式,可以用一个正则表达式去匹配

目前对日志文件的支持还仅限于OSS数据源,因此需要用户预先将日志文件保存于OSS中。

对日志文件建表时,最麻烦的一步就是写正则表达式。下面将以常见的日志文件为例,给出每种文件类型的正则表达式供大家参考。

Apache WebServer 日志

文件内容

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326127.0.0.1 - - [26/May/2009:00:00:00 +0000] "GET /someurl/?track=Blabla(Main) HTTP/1.1" 200 5864 - "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19"

正则表达式

([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?

建表语句

CREATE EXTERNAL TABLE webserver_log(  host STRING,  identity STRING,  userName STRING,  time STRING,  request STRING,  status STRING,  size INT,  referer STRING,  agent STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'WITH SERDEPROPERTIES (  "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?")STORED AS TEXTFILELOCATION 'oss://mybucket/datasets/path/to/webserver.log';

查询结果

mysql> select * from webserver_log;+-----------+----------+-------+------------------------------+---------------------------------------------+--------+------+---------+--------------------------------------------------------------------------------------------------------------------------+| host      | identity | userName | time                         | request                                     | status | size | referer | agent                                                                                                                    |+-----------+----------+-------+------------------------------+---------------------------------------------+--------+------+---------+--------------------------------------------------------------------------------------------------------------------------+| 127.0.0.1 | -        | frank | [10/Oct/2000:13:55:36 -0700] | "GET /apache_pb.gif HTTP/1.0"               | 200    | 2326 | NULL    | NULL                                                                                                                     || 127.0.0.1 | -        | -     | [26/May/2009:00:00:00 +0000] | "GET /someurl/?track=Blabla(Main) HTTP/1.1" | 200    | 5864 | -       | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19" |+-----------+----------+-------+------------------------------+---------------------------------------------+--------+------+---------+--------------------------------------------------------------------------------------------------------------------------+

Ngnix访问日志

以NGINX文档中提到的format为例:

文件内容

127.0.0.1 - - [14/May/2018:21:58:04 +0800] "GET /?stat HTTP/1.1" 200 182 "-" "aliyun-sdk-java/2.6.0(Linux/2.6.32-220.23.2.ali927.el5.x86_64/amd64;1.6.0_24)" "-"127.0.0.1 - - [14/May/2018:21:58:04 +0800] "GET /?prefix=&delimiter=%2F&max-keys=100&encoding-type=url HTTP/1.1" 200 7202 "https://help.aliyun.com/product/70174.html" "aliyun-sdk-java/2.6.0(Linux/2.6.32-220.23.2.ali927.el5.x86_64/amd64;1.6.0_24)" "-"

正则表达式

([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) (\".*?\") (-|[0-9]*) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) (\".*?\") (-|[0-9]*) (-|[0-9]*)

建表语句

CREATE EXTERNAL TABLE ngnix_log(  remote_address STRING,  identity STRING,  remote_user STRING,  time_local STRING,  request STRING,  status STRING,  body_bytes_sent INT,  http_referer STRING,  http_user_agent STRING,  gzip_ratio STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'WITH SERDEPROPERTIES (  "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))? ([^ \"]*|\"[^\"]*\")")STORED AS TEXTFILELOCATION 'oss://mybucket/datasets/path/to/ngnix_log';

查询结果

mysql> select * from ngnix_log;+----------------+----------+-------------+------------------------------+-----------------------------------------------------------------------+--------+-----------------+----------------------------------------------+---------------------------------------------------------------------------------+------------+| remote_address | identity | remote_user | time_local                   | request                                                               | status | body_bytes_sent | http_referer                                 | http_user_agent                                                                 | gzip_ratio |+----------------+----------+-------------+------------------------------+-----------------------------------------------------------------------+--------+-----------------+----------------------------------------------+---------------------------------------------------------------------------------+------------+| 127.0.0.1      | -        | -           | [14/May/2018:21:58:04 +0800] | "GET /?stat HTTP/1.1"                                                 | 200    |             182 | "-"                                          | "aliyun-sdk-java/2.6.0(Linux/2.6.32-220.23.2.ali927.el5.x86_64/amd64;1.6.0_24)" | "-"        || 127.0.0.1      | -        | -           | [14/May/2018:21:58:04 +0800] | "GET /?prefix=&delimiter=%2F&max-keys=100&encoding-type=url HTTP/1.1" | 200    |            7202 | "https://help.aliyun.com/product/70174.html" | "aliyun-sdk-java/2.6.0(Linux/2.6.32-220.23.2.ali927.el5.x86_64/amd64;1.6.0_24)" | "-"        |+----------------+----------+-------------+------------------------------+-----------------------------------------------------------------------+--------+-----------------+----------------------------------------------+---------------------------------------------------------------------------------+------------+

Aapache Log4j 日志

以Hadoop默认生成的日志文件为例。

文件内容

2018-11-27 17:45:23,128 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler: Minimum allocation = 
2018-11-27 17:45:23,128 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler: Maximum allocation =
2018-11-27 17:45:23,154 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration: max alloc mb per queue for root is undefined2018-11-27 17:45:23,154 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration: max alloc vcore per queue for root is undefined

正则表达式

^(\\d{4}-\\d{2}-\\d{2})\\s+(\\d{2}.\\d{2}.\\d{2}.\\d{3})\\s+(\\S+)\\s+(\\S+)\\s+(.*)$

建表语句

CREATE EXTERNAL TABLE log4j_log(  date STRING,  time STRING,  level STRING,  class STRING,  details STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'WITH SERDEPROPERTIES (  "input.regex" = "^(\\d{4}-\\d{2}-\\d{2})\\s+(\\d{2}.\\d{2}.\\d{2}.\\d{3})\\s+(\\S+)\\s+(\\S+)\\s+(.*)$")STORED AS TEXTFILELOCATION 'oss://oss-cn-beijing-for-openanalytics-test-2/datasets/jinluo/nginx/log4j_sample.log';

查询结果

mysql> select * from log4j_log;+------------+--------------+-------+--------------------------------------------------------------------------------------------------+-------------------------------------------------+| date       | time         | level | class                                                                                            | details                                         |+------------+--------------+-------+--------------------------------------------------------------------------------------------------+-------------------------------------------------+| 2018-11-27 | 17:45:23,128 | INFO  | org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler:                   | Minimum allocation = 
|| 2018-11-27 | 17:45:23,128 | INFO | org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler: | Maximum allocation =
|| 2018-11-27 | 17:45:23,154 | INFO | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration: | max alloc mb per queue for root is undefined || 2018-11-27 | 17:45:23,154 | INFO | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration: | max alloc vcore per queue for root is undefined |+------------+--------------+-------+--------------------------------------------------------------------------------------------------+-------------------------------------------------+

总结

对于写日志文件的正则表达式:

  1. 正则表达式中的每个字段用 () 作为边界,日志中通常每个字段以空格分隔。
  2. 建表语句中定义的列的个数要和正则表达式中的字段数完全匹配。
  3. 通常,数字可以用 ([0-9]*) 或者 (-|[0-9]*) 匹配,字符串用(*) 或者 (".*?") 匹配

转载地址:http://lovta.baihongyu.com/

你可能感兴趣的文章
iOS中 支付宝钱包详解/第三方支付 韩俊强的博客
查看>>
赛可达推病毒攻击检测和情报分享服务
查看>>
《社交网站界面设计(原书第2版)》——2.10 自我反省式的出错信息
查看>>
【vue】webpack打包vue项目并且运行在Tomcat里面
查看>>
颠覆传统下载体验 QNAP迅雷系列NAS重磅登场
查看>>
物联网:从源头为生产环境安全把关
查看>>
英巴卡迪诺新年战略:支持Linux提供中文手册
查看>>
梭子鱼任命James Forbes-May为亚太区销售副总裁
查看>>
关于“大数据”的15条干货思考
查看>>
Wind River Helix系统及物联网解决方案 简化企业IOT部署
查看>>
《VMware Virtual SAN权威指南》一第1章 VSAN概述
查看>>
大数据落地决胜的关键——百分点BASIC模型
查看>>
全闪存存储时代 NVMe到底是什么?
查看>>
《数学建模:基于R》——2.2 方差分析
查看>>
大数据的发展,伴随的将是软件工程师的渐退,算法工程师的崛起
查看>>
明明是全闪存阵列,为何存储性能仍然不够快
查看>>
Cloud Foundry 登录 Azure,一键快速部署 PaaS
查看>>
Firefox 44.0将在Linux上启用H.264支持:GTK3仍缺席
查看>>
如何检测出定制服务器中预装的恶意软件?
查看>>
System x迈向更多领域 国内超算步入全面发展时代
查看>>