はじめに
度々ログ調査が発生する問題児(;´༎ຶД༎ຶ`)、ECS on EC2構成にて3年ほど稼働しているとあるRailsアプリケーションについての話となります
問題
ログがたまり続けることでMSCK REPAIR TABLE
の実行が日に日に遅くなってきており、ついに読み込みの完了まで1時間以上かかる状態となってしまいました。
基本的にログ調査というと直近のログが対象となる事が多い状況でしたので、調査開始が遅れてしまいます。
今回試してみた事:シンプルに読み込み対象のログを減らしてみた
現状の構成を確認したところ以下のようになっており、稼働初期からの全ログが読み込み対象となっていました。
CREATE EXTERNAL TABLE `app_prod_rails`(
`date` string COMMENT 'from deserializer',
`container_name` string COMMENT 'from deserializer',
`source` string COMMENT 'from deserializer',
`log` string COMMENT 'from deserializer',
`container_id` string COMMENT 'from deserializer',
`ec2_instance_id` string COMMENT 'from deserializer',
`ecs_cluster` string COMMENT 'from deserializer',
`ecs_task_arn` string COMMENT 'from deserializer',
`ecs_task_definition` string COMMENT 'from deserializer')
PARTITIONED BY (
`year` string,
`month` string,
`day` string,
`hour` string)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
's3://syslog-app/log/app-prod/rails'
TBLPROPERTIES (
'has_encrypted_data'='false')
PARTITIONED BY
句中のyear
についての記述を削除し、LOCATION
句にて/year=2023
の指定を行うという形で、
シンプルに1年分だけ読み込むように新たなテーブルを作って様子見をしてみましたところ、1時間近くかかっていたパーティション読み込みが数分まで短縮されました
CREATE EXTERNAL TABLE `app_prod_rails_2023`(
`date` string COMMENT 'from deserializer',
`container_name` string COMMENT 'from deserializer',
`source` string COMMENT 'from deserializer',
`log` string COMMENT 'from deserializer',
`container_id` string COMMENT 'from deserializer',
`ec2_instance_id` string COMMENT 'from deserializer',
`ecs_cluster` string COMMENT 'from deserializer',
`ecs_task_arn` string COMMENT 'from deserializer',
`ecs_task_definition` string COMMENT 'from deserializer')
PARTITIONED BY (
`month` string,
`day` string,
`hour` string)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
's3://syslog-app/log/app-prod/rails/year=2023'
TBLPROPERTIES (
'has_encrypted_data'='false')
おわりに
パーティション化されているログデータの読み込み範囲の縮小だけであれば、既存のDDLを出力⇒少し書き換えて新テーブルを作成といった手順で対応出来そうでした。そのため、直近のログだけが欲しい、とりあえず早くしたいといった場合には有効かと考えます。
反面、このままでは新テーブルを定期的に作らないといけなかったり、性質上年末にかけて少し重くなってきましたので②としてパーティション射影の導入を実施してみました。
参考