3
1

【Athena】重くなってきたパーティション読み込みを何とかしたい① シンプルに読み込み対象のログを減らしてみた

Last updated at Posted at 2023-12-25

はじめに

度々ログ調査が発生する問題児(;´༎ຶД༎ຶ`)、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を出力⇒少し書き換えて新テーブルを作成といった手順で対応出来そうでした。そのため、直近のログだけが欲しい、とりあえず早くしたいといった場合には有効かと考えます。
反面、このままでは新テーブルを定期的に作らないといけなかったり、性質上年末にかけて少し重くなってきましたので②としてパーティション射影の導入を実施してみました。

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1