Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集

Posted

技术标签:

【中文标题】Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集【英文标题】:Amazon athena can't read S3 Access log files and Athena select query returns empty result sets for every column 【发布时间】:2020-06-21 17:51:12 【问题描述】:

我在 Athena 中成功创建了数据库表。请参阅下面的查询。

   CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.wafbucket_logs(
      BucketOwner STRING,
      Bucket STRING,
      RequestDateTime STRING,
      RemoteIP STRING,
      Requester STRING,
      RequestID STRING,
      Operation STRING,
      Key STRING,
      RequestURI_operation STRING,
      RequestURI_key STRING,
      RequestURI_httpProtoversion STRING,
      HTTPstatus STRING,
      ErrorCode STRING,
      BytesSent BIGINT,
      ObjectSize BIGINT,
      TotalTime STRING,
      TurnAroundTime STRING,
      Referrer STRING,
      UserAgent STRING,
      VersionId STRING,
      HostId STRING,
      SigV STRING,
      CipherSuite STRING,
      AuthType STRING,
      EndPoint STRING,
      TLSVersion STRING
  ) 
  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
  WITH SERDEPROPERTIES (
               'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) 
               \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)
               \\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)
               (?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
      LOCATION 's3://stb-aws-bucket-logging/logs/';

但是,当我对表运行查询时,它返回了一个空结果集。有 20 行但都是空的!!!

SELECT * FROM s3_access_logs_db.wafbucket_logs limit 20;

以前有人遇到过这个问题吗?

谢谢, 团

【问题讨论】:

好消息是 Athena 似乎正在正确读取 S3 位置中的文件,因为它按预期返回了 20 行。这些行很可能是空的,因为 Athena 无法正确解析文件中的数据。我怀疑正则表达式存在问题,即它与文件中的数据不匹配,这将是开始故障排除的好地方。 我直接从 AWS 开发人员文档中复制了正则表达式。我同意它与正则表达式格式有关。但是如何解决呢? 如果您可以分享您尝试遵循的步骤的链接,那么也许我们可以找出问题所在。 【参考方案1】:

我在解析格式中发现了我的错误。它有一个换行符!我从 AWS 文档中复制了访问日志的解析器格式。我想我无意中在解析器格式中添加了换行符!这是正确的解析器格式:

'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*) (?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$'

成功了!!!

你们的 cmets 迫使我重新检查解析器格式。

谢谢, 团

【讨论】:

【参考方案2】:

我遇到了同样的问题,问题很可能出在表配置(正则表达式、字段...)中。就我而言,我使用错误的文档来创建表格。我实际上需要alb日志,但我认为它们与访问日志相同。看看这个:https://docs.aws.amazon.com/athena/latest/ug/application-load-balancer-logs.html

您还可以尝试使用您的正则表达式并从 s3 存储桶手动下载数据并在该正则表达式上进行测试,这对我帮助很大。

【讨论】:

以上是关于Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集的主要内容,如果未能解决你的问题,请参考以下文章

从 Amazon S3 创建表时,Athena 如何将数据与正确的字段匹配?

如何将带有 NULL 值的引用 CSV 读入 Amazon Athena

如何从 Amazon Athena 查询镶木地板数据?

Amazon Athena 表创建问题

当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。

Amazon Athena - 在基本 SQL WHERE 查询中无法解析列