Aws Athena Usage

Aws Athena Usage

Aws Athena Usage
Page content

使用 AWS Athena 通过sql查询日志

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

创建数据库

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

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

创建数据库表

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

AWS Athena ---> Query editor ---> Data source:AwsDataCatalog ---> Database:logDb ---> Tables ---> Create table --

-> from S3 bucket data(选数据从s3获取来创建表)

Step1: Name&Location
    Database: logDb
    Table Name: logs
    Location of Input Data Set: s3://logger.suosuoli.cn/rawlogs/

Step2: Data Format
    Data Format: Apache Web Logs // 数据格式选中apache web日志
    Regex: // 此处填写日志格式对应的 正则表达式

Step3: Columns
    日志有多少列,这里就定义多少列

Step4: Partitions
    如果日志分区存储了,在这里添加分区信息

例如下面的日志格式:

09: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

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

^([^\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:

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

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

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

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

将会输出:

	col1	   col2	     col3      	     col4
1   08:59:59   INFO      183.192.136.0   c28
2   02:52:19   INFO      111.111.136.22  c11
3   01:51:19   INFO      314.163.127.11  c11