何が起こったのか
現在TreasureDataを使っており、日々のデータの蓄積の他に、営業の人など様々な人が抽出したりしたものや、実験などで出力したテーブルを1つのデータベースに入れまくっており、結果無秩序に使っていたせいで、契約の約5倍ほどのレコード数となってしまい、TreasureDataの担当者に怒られてしまいました。
そして、整理しようにも、何が必要で何が不要なのかが分からない状態になっていました。
直近どうしたのか
基本的に全テーブルに対して、「不要」「必要」「直近のデータのみ必要」に分けました。
直近のデータのみ必要はExpireを指定するようにしました。
どうしても不明なテーブルに関しては、みんなに一定期間後に削除する旨を通知して、連絡がない場合はリネーム(論理削除)>一定期間後に削除という手段を取りました。
既存のシステムに異常が発生する際は論理削除の時に大体発覚するので、あまり大事にはならなかった。
これからどうするのか
今回、担当者不明のテーブルなどがありすぎたりして、それを探し出したりするのに非常に無駄な時間を費やしてしまいました。
この反省点を踏まえて、以下のルールを設けました。
- メインのデータベースは仕組み上必要なもののみとする
- 一般のユーザーは読み込みのみとする
- このデータベースはテーブル毎に連絡先を決める
- 実験したり、抽出結果などを出力する専用のデータベースを用意する
- 上記データベースは作成から30日で自動削除される
とりあえずこれで運用していき、問題が出次第修正していこうと思います。
自動削除用シェル
TreasureDataのREST APIを利用して、作成日を取得して一定期間後にDROP TABLEで削除するシェルを作ってみました。
汚いソースですが、備忘録として残しておきます。
#!/bin/bash
##########
# TDのテーブルを作成日時を見て削除していくバッチ
# 要jq:https://stedolan.github.io/jq/
##########
##### 設定する場所
# 残しておく期間
EXPIRE_DAY=30
# TD API KEY
TD_API_KEY="Your TD API KEY"
# 削除対象のdatabase名
DATABASE_NAME="Your Database Name"
##### 以降プログラム部分
BASE_URL="https://api.treasuredata.com"
# テーブル一覧を取得する
RESULT=$(curl -H "AUTHORIZATION: TD1 ${TD_API_KEY}" "${BASE_URL}/v3/table/list/${DATABASE_NAME}")
# テーブル数をカウントする
LEN=$(echo ${RESULT} | jq length)
# 現在のtimestampを取得する
NOW=$(date "+%s")
for i in $(seq 0 $((${LEN} - 1))); do
# テーブル名を取得
TABLE_NAME=$(echo ${RESULT} | jq -r ".tables[${i}].name")
# テーブル作成日
TABLE_CREATED=$(echo ${RESULT} | jq -r ".tables[${i}].created_at")
# テーブル作成日のUNIXタイムスタンプを求める
CREATED_TIMESTAMP=$(date -d "${TABLE_CREATED}" "+%s")
# 経過日を求める(小数点は切り捨てされる)
PERIOD_DAY=$(((${NOW}-${CREATED_TIMESTAMP})/86400))
# 作成より一定期間経っていたらDROP TABLE文発行
if [ ${EXPIRE_DAY} -lt ${PERIOD_DAY} ]; then
# DROP TABLE文を発行
curl -X POST -H "AUTHORIZATION: TD1 ${TD_API_KEY}" "${BASE_URL}/v3/job/issue/presto/${DATABASE_NAME}?query=DROP+TABLE+${TABLE_NAME}" &>/dev/null
fi
done
特定のプレフィックスにより、生存期間を調整できたりすると尚良いと思います。
終わりに
こんな事書いて欲しいとか、こんな場合どうしたのとかあれば書き足して行きますので、ご意見ください。