Aws Athena Usage

使用 AWS Athena 通过sql查询日志

Athena 服务可以根据s3上存储的日志格式来创建相应的hive表,
并可以使用标准sql直接查询日志内容。当日志量非常大时,可以对
存储在s3的日志分区,加快查询速度。(每次在athena console或者使用aws cli
执行sql时,athena就会扫描预先创建表时给定的s3路径下的日志数据,如果
数据量很大,那么每次查询就很慢,而且收费也很高,通过分区存放日志到s3
的不同目录,查询时指定分区查询,避免了athena扫描不必要的数据)

创建数据库

首先到AWS Glue服务中创建一个数据库

1AWS Glue ---> Data catalog ---> Databases ---> Add database ---> 输入名称(logDb) ---> 点击创建

创建数据库表

在AWS Glue 中创建数据库后,到 AWS Athena 服务中创建表

 1AWS Athena ---> Query editor ---> Data source:AwsDataCatalog ---> Database:logDb ---> Tables ---> Create table --
 2
 3-> from S3 bucket data(选数据从s3获取来创建表)
 4
 5Step1: Name&Location
 6    Database: logDb
 7    Table Name: logs
 8    Location of Input Data Set: s3://logger.suosuoli.cn/rawlogs/
 9
10Step2: Data Format
11    Data Format: Apache Web Logs // 数据格式选中apache web日志
12    Regex: // 此处填写日志格式对应的 正则表达式
13
14Step3: Columns
15    日志有多少列,这里就定义多少列
16
17Step4: Partitions
18    如果日志分区存储了,在这里添加分区信息

例如下面的日志格式:

109:59:59 INFO 193.182.132.3 c28 u132862235 usersPlay server_data: [{"scene":38342,"action":0,"serverTime":"2021-01-11 09:59:58","clientTime":"2021-01-11 09:00:20","cache":0,"v":"1.r.1"}]  ServerLog.golang:11

其正则表达式可以这样写:

1^([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+ ?[^\s]+ ?[^\s]+ ?[^\s]+ ?[^\s]+ ?[^\s]+)\s+([^\s]+).*$

上面的的正则表达式有8组,每个括号一组,对应日志的8个列,这样在
创建数据库表的第三步Step3时就需要定义一个8列的表logDb

比较长的字符串写正则比较复杂,可以借助工具来实时检查是否写对:

当正则表达式写好后,表列定义完成后,会生成一个创建表的sql:

 1CREATE EXTERNAL TABLE IF NOT EXISTS logDb.logs (
 2  `col1` string,
 3  `col2` string,
 4  `col3` string,
 5  `col4` string,
 6  `col5` string,
 7  `col6` string,
 8  `col7` string,
 9  `col8` string,
10)
11ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
12WITH SERDEPROPERTIES (
13  'serialization.format' = '1',
14  'input.regex' = '^([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+ ?[^\\s]+ ?[^\\s]+ ?[^\\s]+ ?[^\\s]+ ?[^\\s]+)\\s+([^\\s]+).*$'  --注意到input.regex中的正则需要多加一个转义符\
15) LOCATION 's3://logger.suosuoli.cn/rawlogs/'
16TBLPROPERTIES ('has_encrypted_data'='false');

运行生成的sql创建数据库表

在Athena console 点击生成的sql运行,创建表,创建后就可以直接使用sql查询了
比如这样的sql:

1SELECT col1, col2, col3, col4 FROM logDb.logs limit 3;

将会输出:

1	col1	   col2	     col3      	     col4
21   08:59:59   INFO      183.192.136.0   c28
32   02:52:19   INFO      111.111.136.22  c11
43   01:51:19   INFO      314.163.127.11  c11

Go004 a Complete View of Golang Hello World
博客评论提醒