たけのこブログ

凡人が頑張って背伸びするブログ

Dockerで簡単にBigqueryのデータをjupyterから可視化する方法

「誰でも簡単にDS環境作って、データベースからデータを持ってきて、結果を可視化できるようにしたい」

企業によって様々ですが、分析する方が業務で行う良くあるパターンとして、

・RDSやBigqueryなどからクエリを叩いて必要なデータを収集 ・収集したデータでいろんな分析をして報告→実装へ

みたいな流れがあると思います(特に、仕様設計やPoCを行う前後ではこんな感じになりやすいと思います)。

上記の手順で行うと、解析する方と結果検証する方々(営業や上司)との間に隔たりがあると感じています。理由としては、以下が考えられます。 ・解析した人がミーティングの際に一方的に報告するケースが割と多め →結果検証する側も手軽に同じ環境で結果を可視化できると、考慮できる幅が広がる可能性がある ・皆が動かせる環境を構築して逐一API叩いて結果を確認するよりは、ローカルで手軽に動かせるくらいの方が柔軟性があって良い などなど ・とにかく保守性を!!!

しかしながら、解析作業などを行なった経験がない方からすると、どのように環境を構築したら良いか分からなかったりすることも多いため、なるべく簡単に環境構築+結果検証を行えるようにする必要があります。今回は、Bigqueryのデータを以下に簡単にjupyterなどで可視化するかについて焦点を当てたいと思います。

Dockerで簡単にDS環境を構築して、Bigqueryの結果を可視化する

そこで今回ご紹介するのは、以下の環境の構築方法です。 ・Dockerで簡単にDS環境を構築 ・BigQueryのデータを可視化する 以下、具体的な手順を説明します。

1.Dockerをインストール

Macでのインストールは、以下のURLを参考にしてDockerをインストールしてください。 qiita.com

2. docker-compose.ymlを作成

自分のPCの好きなディレクトリの中に、docker-compose.ymlを作成します。vimvscodeでも良いので以下を貼り付けコピペします。

version: "3"
services:
  jupyter:
    image: jupyter/datascience-notebook
    ports:
      - "8888:8888"
    volumes:
      - jupyter_data:/opt/conda
      - jovyan_data:/home/jovyan
    container_name: jupyter
volumes:
  jupyter_data:
  jovyan_data:

この手順は、以下のURLなどを参考にしました。

qiita.com

qiita.com

3. コンテナを起動

ターミナルで以下を実行してコンテナを起動します(全体で4GBくらい容量を食います)。

docker-compose up

4. コンテナの中に入る

次のコマンドを実行して、コンテナの中に入ります。

docker exec -it CONTAINER-ID /bin/bash

CONTAINER-IDについては、docker ps -aを実行して対象環境のコンテナID(jupyter/datascience-notebookの左隣の文字列)を確認してください。

dockerの基本的なコマンド(停止や再起動)に関しては、以下のURLに纏まっているので、あまりコマンドに慣れていない方はこちらを参考にしてください。

tkmr.hatenablog.com

個人的には、vscodeにdockerの拡張機能を入れて管理するのが楽ちんです。

qiita.com

こちらを使うと、写真みたいに管理しつつ右クリックで簡単にコンテナを起動したりできます。

f:id:YuKR:20200820172856p:plain

5. jupyter notebookをブラウザで立ち上げる

docker logs jupyterと打って、docker起動後にjupyterをブラウザで立ち上げるために必要なトークンを取得します。実行すると以下のような形で表示されるので、出力の一番下のURL(下の例ならhttp://127.0.0.1:8888/?token=から続いてる文字列)を保存して、docker内でjupyterを立ち上げた後にそのURLを開くと環境に入れます。

To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-8-open.html
    Or copy and paste one of these URLs:
        http://6330a9d586d7:8888/?token=d93c8b5d127479b788b49e083cc75d431b0188e8d33c0335
     or http://127.0.0.1:8888/?token=d93c8b5d127479b788b49e083cc75d431b0188e8d33c0335

こちらについては、以下のURLを参考にしました(2回目以降のjupyter環境への入り方も載ってます)。

qiita.com

6. 必要なモジュールをターミナルかjupyter上のターミナルからインストールする

Jupyter環境からBigQueryのクエリを叩いて結果をデータフレームとして表示させたいので、以下のモジュールをインストールします。

pip install pandas-gbq -U
pip install --upgrade google-api-python-client
pip install --upgrade oauth2client

7. BigQueryの結果を可視化する

一例ですが、以下のコードでBigQueryのクエリを叩いて結果を可視化することができます。実行するとURLからgoogle accountの認証を行う必要があり、それが終わると結果を可視化できます。

%load_ext google.cloud.bigquery # クエリを実行するためのおまじない
import pandas as pd
sql = '''
SELECT
sys_created as sys_created,
comments,
FROM tables
'''
data_frame = pd.read_gbq(sql, プロジェクトID, dialect='standard')

これで環境構築&可視化が実行できました!

参考URL:

cloud.google.com

オプション: credentials情報を読み込んでBigQueryの結果を可視化する方法(自動化したい場合)

上記の手順まで行えばdocker、環境からBigQueryのクエリを叩いて結果をpandasなどで簡単に可視化を行うことができます。しかし、もう一つの方法としてcredentials情報を読み込んでクエリを叩いて可視化する方法があります。こちらをマスターすればURLからgoogle accountの認証がいらないので、可視化コードを自動化することができます。

まず、すでにGCPのサービスアカウントキーをjsonで生成してる方は必要ないですが、そうでない方は以下のURLなどを参考にしてサービスアカウントキーを取得してください。

www.magellanic-clouds.com

そして、生成したキーをjupyterのworkディレクトリにアップロードして、以下のように実行して結果を可視化します。キーの名前は、コード内ではsecrets.json命名してます(サービスアカウントキーは大切なものなので、失くさずに大事に保管してください!)。

from google.cloud import bigquery
from google.oauth2 import service_account
import pandas as pd
import os

key_path = os.path.join('/home/jovyan/work', 'secrets.json')

credentials = service_account.Credentials.from_service_account_file(
    key_path, scopes=["https://www.googleapis.com/auth/cloud-platform"],
)

client = bigquery.Client(credentials=credentials, project=credentials.project_id,)

query = '''
SELECT
sys_created as sys_created,
comments,
FROM tables
'''

df = pd.read_gbq(sql, project_id=credentials.project_id, dialect='standard')

まとめ

今回は、dockerでデータサイエンス環境を整えて、dockerのjupyterからBigqueryを実行して結果を可視化する方法をまとめてみました。Bigqueryにデータがあるなら誰でも気軽に環境を作って可視化&解析できるので、興味のある方はぜひ試してみてください。