All Articles

「10年戦えるデータ分析入門」の環境をVSCode Devcontainerで構築

アマゾンプライムデーで青木峰郎さん著の10年戦えるデータ分析入門が安くなっていたので購入してみました。

仕事でSQLは使用するので文法はわかるのですが、OLTPシステムのデータストアとして使っているのがメインであるため、 データ分析目線でのSQLはそこまでやったことがなかったので面白かったです。最近はdbtでTransformationを管理するのがどんな感じなのか興味があるので今度試してみようと思っています。

本書では小中規模にRDBMSを使ってデータ分析を行う際によく使われることがおおいPostgreSQLを例として分析SQLについて解説しています。 本書は発売年が2015年で環境構築にはLocalにPostgreSQL環境を構築する手順が記述されています。

一方で、2023年現在だとPostgreSQLを試したいとき一番手軽な手段の一つはDockerを使ってDBを立てる方法だと思います。

自身がこの本のSQLを試す際にLocalにPostgreSQLをインストールしてデータをロードするのは面倒だし、環境が汚れるのが嫌だったのでVSCode DevcontainerでSQLを実行するための環境を構築し、PostgreSQLをサイドカーとして立ち上げられるようにしました。

既にVSCodeとDockerをLocalに入れている方は簡単にLocalに分析環境を立ち上がることができます。VSCodeとDockerを入れることさえ面倒だという方は、ブラウザとGithubアカウントさえあればGithub Codespacesで環境を立ち上げることも可能です。

目次

使い方

環境構築

コードはGithubでレポジトリを公開しています。

Github Codespacesを使う

GithubアカウントさえあればGithub Codespacesを使って環境を立ち上げることができます。

まずはブラウザでこのレポジトリを開きます。

CodeボタンをクリックしてCodespacesタブを選択しCreate codespaces on mainをクリックします。

code

すると環境の構築が始まるので数分待ちます。

building container

環境が立ち上がります。

codespaces

終了したいときは左下のcodespaceをクリックしてメニューを表示しStop Current Codespacesを選択するとCodespaceが止まります。

shutdown codespaces

Localで実行

Localで環境を構築したい場合は以下の製品がインストールされている必要があります。

本記事ではインストール方法について述べませんが、それぞれの製品の公式ページを参照してもらえばインストールできると思います。 それが面倒な方はGithub Codespacesを使って手軽にやりましょう!

まずは作業ディレクトリにGithub Repositoryをクローンします。

git clone https://github.com/atsuik/sqlanalysis10years

レポジトリに移動し、VSCodeを開きます。

cd sqlanalysis10years
code .

F1でメニューを開きDev Containers: Open Folder in Container...を選択します。

local open

レポジトリを選択し、OKをクリックするとDevcontainer環境に接続します。 初回はContainerのBuildに少し時間がかかるので数分お待ちください。

local open2

データのロード

データを『10年戦えるデータ分析入門』サポートページからダウンロードしてPostgreSQLにロードするためのシェルスクリプトを用意しています。

サンプルデータは最小限のデータセットと一部のテーブルについてはレコード数を増やしたデータセットが用意されており、それぞれ

  • load_data.sh
  • load_large_data.sh

でロードできます。

VSCodeのTerminalで以下のようにコマンドを実行してデータをDBへロードしてください。

./load_data.sh

command

大きいサンプルデータを使いたい場合は先にload_data.shを実行してから、load_large_data.shを実行してください。

一通りのデーブルが作成されたのち、一部のテーブルが再作成されます。

./load_data.sh
./load_large_data.sh

SQLの実行

SQL実行用のJupyter Notebookをnotebook/sample.ipynbに用意しています。

このファイルを開きます。

command

一つ目の実行セルを実行するとDBへ接続します。

以後コードのセルでSQLを実行することが可能です。 セルの実行ボタンをクリックするか、セルを選択してShift+Enterでセルを実行します。

SQLを実行するためにはマジックコマンド%sqlまたは%%sqlをセルの最初に入力する必要があります。

SQLが一行の場合は%sqlを使用し、複数行の場合は%%sqlを使います。

例えば以下のように入力します。

一行のときは

%sql select * from access_log limit 10;

SQLが複数行にわたるときは

%%sql
select 
    *
from access_log
where
    request_method = 'GET'
limit 10
;

でSQLを実行できます。

データ分析は自身で実際にコードを実行してみないと頭に入ってこないところが大いにあるので皆さんも環境を構築して、実際に本に書いてあるSQLを実行してみたり、SQL文に手を加えて実行してみてください。より本書の解説への理解が深まると思います。

仕組み

ここからはどうやって環境を構築したかを説明していきます。使うだけなら読む必要はないので、興味がある方はどうぞ。

Devcontainer

開発環境の構築とPostgreSQLのContainerの準備にVSCode Dev Containers を使用しています。

ざっくりいうとDevcontainerはVSCodeをDocker Container内の環境に接続して開発を行うためのExtensionです。

開発環境をContainerで作るメリットとしては

  • 複数人で開発を行う際に開発環境を簡単に統一することができる
  • 環境が壊れてしまった場合簡単に環境を再作成できる
  • Github Codespacesを使うとクラウド上に開発環境を簡単に構築できる

などが挙げられます。

私はその時々でWindowsでwsl、Ubuntu、Macで開発を行っているので環境を簡単に統一できるDevcontainerは重宝しています。 また、プロジェクトに新しいメンバーが入った時も、VSCodeとDockerさえインストールすれば開発環境を立ち上げられるのでオンボーディングが楽です。

定義は.devcontainer/docker-compose.ymlに記述しており、 今回は

  • app
  • db

の二つのContainerを定義しています。

appが開発環境でContainerの定義は.devcontainer/Dockerfileで行っています。 Juppyterの環境を構築したり、psqlをインストールしたりしています。このContainerがVSCodeが直接接続する環境です。

そしてdbがPostgreSQLのContainerとなっています。

version: '3.8'

services:
  app:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    env_file:
        - .env

    volumes:
      - ../..:/workspaces:cached

    # Overrides default command so things don't shut down after the process ends.
    command: sleep infinity

    # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
    network_mode: service:db

    # Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
    # (Adding the "ports" property to this file will not forward from a Codespace.)

  db:
    image: postgres:latest
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    env_file:
        - .env

    # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally.
    # (Adding the "ports" property to this file will not forward from a Codespace.)

volumes:
  postgres-data:

app ContainerからはdbのhostnameでPostgreSQLに接続することができます。

Devcontainer内で使用するVSCode Exteinsionは.devcontainer/devcontainer.jsonで定義しています。

実行環境

開発環境 app のPython環境の設定はmicromamba を使用しています。

micromambaのコミュニティーはDockerhubにmicromamba用のContainerを公開しています。

Containerの定義 .devcontainer/Dockerfile はこのContainerをベースにドキュメントを参考に作成しました。

env.yamlに必要なパッケージが記述されており、 Dockerfileの

COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml
RUN micromamba install -y -n base -f /tmp/env.yaml && \
    micromamba clean --all --yes

で環境構築が行われています。

サンプルデータのロード

サンプルデータのPostgreSQLへのロードはload_data.shで行っていますが、 核心部分は

PGPASSWORD=$POSTGRES_PASSWORD psql -h db -U $POSTGRES_USER $POSTGRES_DB -f load.sq

です。DBへの接続情報は.devcontainer/.envで定義したものがContainerの環境変数に格納されています。 このコマンドでサンプルデータのロード用のSQLを実行しています。

ちなみに以下のコマンドでPostgreSQLのセッションを開いて、SQLを実行することも可能です。

PGPASSWORD=$POSTGRES_PASSWORD psql -h db -U $POSTGRES_USER $POSTGRES_DB
```

Published Jul 16, 2023

スタートアップで働くデータエンジニア兼データサイエンティスト。興味の範囲はデータパイプラインの構築、データ分析、機械学習、クラウドなどなど。