/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

BigQueryのデータセット管理ツール作った

BigQuery のデータセットも Terraform で管理*1ができるのですが、権限の管理に対応していない。。。
ぶっちゃけ Terraform じゃなくて、もっとシンプルな形 (ステートファイルを持たず、設定ファイルのみ管理する形) で管理したいなと思い作ってみました。

使い方は README 参照してください。Terraform 的なコマンドとなっています。
YAMLファイルは GIT 等で管理して、CI回すと良いと思います。

テーブルの管理にも対応するかな。

Enjoy!

PyAthenaでRedashのクエリランナー書いた

プルリクマージされました。ありがとうございます。
これでカジュアルにAthenaにクエリ投げまくりですね。

Enjoy!

AWS請求レポートをPyArrowでParquet+Snappyに変換する

AWSコストの可視化として、請求レポート*1をAthena*2でクエリを投げられる形式に変換して、Redash*3でダッシュボードを作成していたりします。 元データがCSV+ZIPと非常に扱いにくい形式なのでCSV+GZIPに変換していたのですが、カラムナー形式に変換すると良さそうだなと思い、PyArrow*4を使ってParquet*5+Snappy*6に変換してみました。

以下のスクリプトはS3に出力されている請求レポートをダウンロードしてきて、Parquet+Snappyに変換、Athenaで扱いやすいパス(Hiveのパーティショニング形式)にアップロードするようなPython3のスクリプトの例です。
少し形は違いますが、同じようなことをAirflow*7を使って毎日ぶん回しています。月初にはパーティションを追加、4〜5日目ぐらいまでは前月のデータも更新されるので当月分と合わせて変換するような事をしています。パーティションの追加にはもちろんPyAthena*8を使っています。マルチアカウントで請求情報を集約している場合は ratecostblended_rateblended_costunblended_rateunblended_cost になります。タグも合わせて出力する設定にしている場合は、resource_id の後ろにタグの情報が追加されます。

PyArrowはPandas*9のDataFrameから簡単にParquet形式のデータを出力できます。オンメモリの処理になるので、解凍したファイルのサイズ+αのメモリが必要となります。

Athenaのテーブル定義は以下です。

日付はtimestamp型で持ちたいのですが、文字列型でないとエラーが発生しました。日付型を上手く扱う方法は正直よくわかってないです。。。

カラムナー形式にすることでスキャン量をかなり減らすことができます。クエリの実行速度が速くなることは期待していなかったのですが、意外と速くなりました。CSV+GZIPと比べてクエリにもよりますが、スキャン量は10分の1、速度は5分の1ぐらいになりました。

PyArrow非常に便利ですね。請求レポート以外にもETL処理で色々と使い所はありそうです。
Apache Arrow*10PythonだけでなくRubyもサポートされて始めています*11。素敵なETLライフを。

Enjoy!

Amazon AthenaのPythonクライアント書いた

AthenaがAPI/CLIに対応した*1ので boto3*2で少し使ってみたのですが、クエリ実行結果のパースが非常にめんどくさい。
もっとカジュアルにクエリを投げたいなってことで、PEP249*3に準拠したクライアント書きました。

使い方はJDBC*4と変わらないです。コードもほとんど流用する形です。
ポーリング中のリトライ処理は実装した方が良かったかも。。。
asyncio*5対応とかしたいですね。

Enjoy!

PyAthenaJDBCでRedashのクエリランナー書いてみた

redash-athena-proxy*1を使ってRedashからAthenaにクエリを投げれる環境を作っていたのですが、どうもtimestamp型やdate型の戻り値が日付として上手く認識しない。。。
おそらくproxy側のGSONの日付型のシリアライズ設定の問題かと思われるのですが、調べるのだるい、proxyのような外部プログラムを別に立てるのやめたい、かつ自分で作ったライブラリ*2でクエリランナーが簡単にかけそうだったので書いてみました。(ほとんどPrestoのクエリランナーのコピペですが)

Docker環境で運用してるので以下の様にベースのイメージにOpenJDK等を入れたイメージを作成しています。(あまりイメージのスリム化とかは意識していないのであしからず)
環境変数REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.athena の設定を忘れずに。以下のDockerイメージであれば、必須項目の設定だけでAthenaにつながります。 (インスタンスのIAMロールにも対応してるのでアクセスキーの設定は必須ではなかったりするのですが、もろもろ事情があって必須設定にしています)

S3のデータを雑に検索できるのは非常に便利なのですが、いかんせん遅い。。。ORC+Snappyでも遅い。。。とにかく遅い。。。
速度面でBigQueryに対抗できるプロダクトになってくれると良いですね。

Enjoy!

S3DistCpをリモート実行したい

S3DistCp*1をよく使うのですが、 複数のS3DistCpを実行する場合、クラスタにステップを追加する形だと1ステップづつシーケンシャルに実行され、かなり待たされることになります。 ステップを追加する形ではなく、SSHでリモート実行できると任意のタイミングで実行できて良さそうだなと思い、Paramiko*2を使って実装してみました。結構簡単に実装できますね。

Enjoy!

PythonからAmazon AthenaにJDBC接続するラッパー

暇を持て余していたので作ってみました。
バージョン番号は諸事情により1.0.1となってしまいました。(心温かみのある手作業でのリリースはまずい。。。)

既知の問題点
  • Decimal型をフェッチすると落る
    ドライバのバグのようです。フォーラムにも上がってました*1
  • クエリのキャンセルができない
    クラスファイルを見る限り、現在の実装だとクエリのキャンセルはできないっぽい。

AthenaのJDBCドライバのライセンスが不明なので、再配布(whlファイルにはJARが含まれます)とかまずかったりするかも。。。
まずい場合はご連絡いただければ。

Enjoy!