皆さんこんにちは!
クルトンです。
今回はAmazon Athena(以下、Athena)で、Create Table
をする際にログデータをパースする方法を調べて実際にやってみました。
こちらの記事を参考に進めています。
今回使うデータの説明
今回使用するサンプルのアクセスログのデータはこちらのものを使います。S3バケットのアクセスログです。
5個のレコードがあるので、ローカルにテキストファイル(ファイル拡張子はtxtとして)保存してください。
また、同ページにログデータのフォーマットが記載されています。どういったデータがどのようなフォーマットで1レコードの中に含まれているかが書かれています。
パースする時に重要なのは、ログのフォーマットがどうなっているかを知っておく事です。フォーマットとして、どういったデータが格納されているかを知らなければ、どのようにパースをすれば良いか分からないためです。是非、ご確認ください。
アクセスログデータの格納先
Amazon Athenaは内部でAWS Glueと連携しており、AWS Glueでテーブルの設定やデータベースの作成が出来ます。 テーブルデータの作成にはS3 URIを使っているため、まず最初に、ローカルに保存したアクセスログのデータをS3へ保存してください。
AWS Glue上でマネージメントコンソールを使ってデータベースの作成などの操作をする事も可能ですが、今回はAthena上でデータベース作成やテーブルの作成を行います。
データベースの作成
Athenaの画面上で次のクエリを実行してください。データベースが作成されます。
create database <お好きなデータベース名>
AWS Glue上では次の画像で示している、Data catalogのDatabaseを確認するとデータベースが作成されているか確認が出来ます。
エラー
ちなみに同じ名前で作成しようとすると、次のようなエラーが出ます。
[ErrorCategory:USER_ERROR, ErrorCode:DDL_FAILED], Detail:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database <作成しようとしたデータベース名> already exists
データベース名を別名にするか、同名の既に存在しているデータベースを削除してから改めてcreate database
をしてください。
テーブルの作成
CREATE EXTERNAL TABLE `<作成したデータベース名>.<作成したいテーブル名>`(
`bucketowner` STRING,
`bucket_name` STRING,
`requestdatetime` STRING,
`remoteip` STRING,
`requester` STRING,
`requestid` STRING,
`operation` STRING,
`key` STRING,
`request_uri` 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 (
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$'
)
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '<テキストファイルを保存したS3バケット名>'
これで実際にテーブルが作成されました。
それぞれの句の説明は次の通りになります。
- CREATE EXTERNAL TABLE
- Athena上でテーブルを作成する時に使用
- 指定した名前でテーブルが作成されます
- EXTERNALを入れている事でファイルの置き場所を指定するLOCATIONを使う事を意味します
- ROW FORMAT SERDE
- フォーマットの指定をしています
- 今回はHiveの正規表現の書き方をするという指定になります
- WITH SERDEPROPERTIES
- 正規表現の中身を書いています
- 正規表現の中身については、そもそものデータを格納する際にログフォーマットが指定されているかと思いますので、そちらを参考に書けば良いかと思います。
- STORED AS INPUTFORMAT
- 元データのファイルフォーマットを選択します
- 今回はテキストファイルを使うという指定です
- OUTPUTFORMAT
- 出力時のデータのフォーマットを指定します
- LOCATION
- 対象ファイルの保存先を指定します
- ファイル保存先の指定としてS3 URIを使用します。
これでデータベースに紐づいたテーブルが作成できました。実際にデータがどのように入っているか確認したい場合は、SQL文を実行して確認可能です。
作成したテーブルの中身について簡単に確認するには、作成したテーブル名の右端にある⋮
をクリックし、次の画像で表示されるメニューの中にある、テーブルをプレビュー
をクリックしてください。
テーブルをプレビュー
をクリックすると、次のように10レコード表示されるようなSQL文をクエリエディタ上で実行してくれます。
SELECT * FROM "<データベース名>"."<テーブル名>" limit 10;
終わりに
今回は簡単にですが、アクセスログデータを使って、パースをしてみました。
様々なデータ形式に対応しているので、データを手早く確認したい場合にAthenaは便利そうですね。
今回はここまで。
それでは、また!