2020/08/11 追記
Azure Synapse Analytics でShrink DatabaseがGAになったそうです。教えてくれた人ありがとう。
はじめに
Azure SQL Data Warehouseはで苦労した話。
Azure SQL Data Warehouse(現 Azure Synapse Analytics )とは
昔はAzure SQL Data Warehouseをバッチ用サーバーとして使っていました。(今はApache Sparkに置き換えました。)
Data WarehouseっていうのはAWSで言うところのRed Shift, GCPで言うところのbig table みたいなもので、巨大なSQLSERVERっぽいものが建てられるサービスです。
何がひどいの?
Azure SQL Data Warehouseの嫌なところは色々あるけど、一番ビックリしたのはデータベースの容量を削除しても課金が停止されない点です。
どういうことか。
分析業務をやっているとテーブルがいっぱい作成されると思います。いっぱいテーブルを作成するとストレージ容量が増えてきていっぱい課金されます。ここまでは良いです。
日が立つに連れどんどんデータが溜まっていくと思います。ストレージ料金もどんどん増えていきます。
あまりに古いデータは要らないので、昔作ったテーブルは削除します。すると当然ストレージの使用量は減るので、課金額も減ると思いますよね?減らないんです。
テーブルをたくさん作るとストレージが勝手に拡張されて容量が確保されるのですが、一旦確保されたストレージはテーブルを消しても勝手に解放されません。空き容量として課金され続けます。
テーブルのデータが単調増加している場合は テーブルのデータ量=確保されたストレージ量
なのですが、テーブルを削除し始めると、テーブルのデータ量 + 空き容量 = 確保されたストレージ量
になります。
「え、じゃあ空き容量を開放して課金を減らす方法を教えてよ」とサポートに聞くと「shrink database っていうコマンドがあるけど非推奨です」って返ってくるんですよ。なんと公式に空き容量を減らす方法は無いのです。
https://docs.microsoft.com/ja-jp/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql?view=sql-server-ver15
↑見たら今でも非推奨だった。
結局非推奨でもいいからshrink databaseを回して課金額を減らしました。
他にもバッチ処理が遅いのが嫌だった。最適化しようにも資料が少ないので全然わからない。その点有名なオープンソースは資料がたくさんあって素晴らしい。
のちにAzure SQL Data Warehouseは全部廃止、バッチ処理はSparkに置き換えて課金も安く、処理も早くなりました。
そもそも
バッチ処理と解析業務をAzure SQL Data Warehouseで全部してるのが間違っていた。
バッチの(非リアルタイム)データ解析は(自分の中では)3つに分かれると思う。この3つに適材適所のツールを当てなめないと、めんどくさいことになる。
データ収集処理系ツール
端末やセンサーからデータを受け取る。落ちないことが大事。
- Apache Kafka
- AWS kinesis
など
データ加工系ツール
データにマスターテーブルなどとJOINして分析用データを生成する。
- Apache Spark
など
データ解析系ツール
データをいい感じに並び替えて(インデックスを張る)素早く検索できるようにしたりBIにデータを表示する。
- elastic search
- kinetica
- Azure SQL Data Warehouse
間違ってデータ解析系ツールで複雑で膨大なJOINやGROUP BYを実行すると遅いし、データ加工系ツールで分析業務をするとレスポンスが遅れてイライラする。
Azure SQL Data Warehouseはどっちかって言うとデータ解析系ツールだった。(実際データの検索は速い)
まとめ
ツールは適材適所で使おうね、という話。