はじめに
本記事はデータラーニングギルドAdvent Calendar 2021 16日目の記事となります。
データサイエンス未経験ながら、とある経験をデータラーニングギルド代表の村上さん(@tomoyuki-murakami)に評価頂いて、
今年の8月からデータ分析案件に関わらせて頂くことになりました。
そのあたりのことをふわっと振り返って行ければいいな、と思います。
とある経験って何?
1年間だけですが、都内の認可保育園にて保育士をやっていた経験です。
0~4歳満遍なく見てましたが、0歳ちゃん長めです。
ちなみに4年制大学を卒業していれば、保育士試験をパスするだけで保育士資格が取れるようになっています。
未だに保育士は不足しているようなので、エンジニアに疲れたら挑戦してみてください(私もSIerしながら資格取りました)。
今何やってるの
赤ちゃんの行動を記録する育児アプリのデータ分析をしています。
最初の大きな案件としては、アプリ内のあるレポート機能を表示するためのデータパイプラインを作成しました。
リリース前につき多くは語れないので、パイプラインのアーキテクチャを軽く解説してみようとおもいます。
Digdag
バッチ処理を行うときの定番ツールです。
ワークフローを書くことでBigQueryとPythonの実行を制御します。
digdagサーバはdockerコンテナ上に立て、docker-compose.ymlに環境変数を書いておくことで、
開発/本番環境の差異を吸収することができます。1
githubにdigファイルとsqlをまとめて置いておき、適宜以下のことを行うワークフローを作成しておくとソース管理に便利です。
$ git pull
$ digdag push hogehoge_workflow
Python処理はGCPのAI Platform Notebooksのインスタンスを別途立てています。
gcloud CLIで以下のようなコマンドを打つことで、他サーバに配置されたノートブックの実行することができます。
# digdagサーバにて
$ gcloud compute ssh fugafuga-instance --command="/usr/local/bin/exec_notebook.sh /home/jupyter/src/calculation.ipynb"
gcloud compute ssh
にてコマンドを実行すると、Jupyter Labをブラウザで開いた場合のパスとは変わってしまうので、
ノートブック側に以下のようなラッパーを置いておきます。
#!/bin/bash
export PATH="/usr/local/cuda/bin:/opt/conda/bin:/opt/conda/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin"
jupyter nbconvert --execute $1 --to notebook --inplace
Firebase
データベースにデータを突っ込んで置くと、RESTfulなAPIサーバとして扱うことができるBaaSです。
サーバレスでメンテいらず!爆速!しゅごい!
アプリケーションサーバーとデータの受け渡し方法は色々あるかと思いますが、
- 扱うデータの総量が小さい
- 複雑な検索クエリは必要無い
- アプリケーションサーバ側のRDBがAzureだったため、気軽にレプリケーション用のサーバを立てれない
などの理由でFirebaseによるAPI方式を採用しました。
難点としては、
Firebaseのデータベースは(Realtime DatabaseにせよCloud firestoreにせよ)、
json型の構造化データを使用するため、BigQueryと食べ合わせが悪いです。
今回はBigQueryで作成した分析結果をFirebase用のjsonに変換する処理をPythonで書き下しました。
{
[{
"user_id": "A-san",
"feature": "XXXX",
},
{
"user_id": "B-san",
"feature": "YYYY",
}]
}
{
"A-san" : {
"feature": "XXXX",
},
"B-san" : {
"feature": "YYYY",
},
}
おわりに
今回は技術寄りのお話に終始しましたが、
保育のドメイン知識がこんな感じに生きたよーっていう話を次回があればしたいな、と思います。