データエンジニアリングのためのPostgreSQLを立ち上げる

はじめに

まずは雑談から。

たまたま興味ある記事で特集されていたので、久しぶりにHBRを買いました。顧客体験へのテクノロジーの活用が本格化しています。IoTの活躍するフィールドも広がりそうです。

ただ、気になるのが5Gが商用化されれば、世界が大きく変わるといった論調です。4Gのサービスの普及に伴い、スマホを通じた顧客体験が大きく変わってきたことは実感してきました。それでもスマホの価格が高いのと同様に、IoTの通信端末と通信コストは意外と高いです。規模の経済が働かせられるかどうかとい視点ももたないと、おそらく投資に見合わず、Connected ProductやConnected Serviceへの取り組みは失敗するでしょう。

そのためには、上記の規模経済の視点でのプラットフォーム選択が鍵となるかなと思っています。クラウドサービスを組み合わせて作っていくのは、採用側にもかなりの知見が必要(=結局高くつく)ので、よくできたプラットフォームの採択が現実的なのではないかと考えています。

閑話休題

導入部分が長くなってしまいましたが、本題へ。昨年あたり、プロジェクトでログデータの分析をしていました。このときは、かなりアドホックに、行きずりで要望が出てきたので都度、IoTプラットフォームやELKのログをAPIで呼び出して、データを加工していました。このときは機器が動かなくなるタイミングを捉えるために、数日間分の機器の稼働状況をデータを加工して可視化するプログラムをPytho+Jupyter Notebookで提供していました。ただ、毎日実行すると、過去のある日のデータを何度もAPIをコールして同じロードすることになるので、無駄な感じがありました。

ある程度、こうした作業が定常化してきた段階で、データは再利用できる形で保存するべきだと思います。データの量や用途によって、ファイルや、リレーショナルデータベース、NoSQLなど考えられます。ここでは、ローカルでリレーショナル・データベースを起動することを考えます。

例として、Dockerコンテナとして、PostgreSQLのイメージをダウンロードして起動します。

プロジェクトとしては、以下も参照ください。
https://github.com/HajimeK/DEND/tree/master/project1
ここのReadme.msの日本語翻訳です。

実行環境

Docker

以下では、Dockerが実行可能であることを前提にすすめています。
私の場合は、Ubuntu 18.04 の環境にaptでインストールしました。

sudo apt install docker

Python

PostgreSQLにはクライアントツールとしてpsqlというものがあり、こちらで作業を行えるのですが、外部APIの呼び出しや、ちょっとしたデータの加工はプログラムで行うのが便利です。この記事では実際には使用しないのですが、今後のため、PostgreSQLと連携するためにPythonの環境として準備が必要な内容について説明します。Python自体はanacondaで環境を準備しています。

$ conda -V
conda 4.8.0

PythonならびにJupyter NotebookとPostgreSQLと連携させるために、

  • psycopg2
  • ipython-sql
    の2つをインストールします。pipではなく、Anacondaのコマンドを使ってインストールします。

    $ conda install psycopg2
    $ conda install -c conda-forge ipython-sql

PostgresSQLのDockerコンテナの立ち上げ

以下のコマンドを実行して、PostgreSQLのイメージをダウンロードして起動します。PostgreSQLのバージョンを指定したければ、Docker Hubから目当てのバージョンをlatestと置き換えて実行してください。

$ sudo docker run -d --name postgres -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD=DEND postgres:latest

初回実行は2,3分かかりますが、上記コマンドの実行が終了すると、以下のコマンドで起動している、PogstresSQLのDockerコンテナを確認できます。

$ sudo docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                      PORTS                                                                         NAMES
5b985b8dae76        postgres:latest                 "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds                127.0.0.1:5432->5432/tcp                                                      postgres

停止したい場合は、

$ sudo docker stop postgres

起動したい場合は

$ sudo docker start postgres

上記で実行すると、PostgreSQLにはポート番号5432でアクセスすることになります。コンテナ立ち上げの際に、 -p 127.0.0.1:5432:5432を指定しなかった場合、localhostではアクセスできませんでした。そのときは、以下のコマンドで、コンテナのIPAddressを見つけて、アクセすることになりました。

$ docker inspect postgres

JSONデータを含む、配列データが帰ってくるので、その中から、 "NetworkSettings"->"IPAddress"に設定されているIPアドレスを参照してアクセスしてください。

Dockerを上述のように -p 127.0.0.1:5432:5432を指定して実行した場合は、デフォルトのlocalhostでアクセスできます。

データベースサーバでの作業

上記まで実行して、PostgreSQLを起動した後は、作業用のデータベースやユーザーを作成していくことになるかと思います。
PostgreSQLではクライアントツールとしてpsqlというものがあり、Dockerコンテナにシェルで入って、ツールを起動することで、データベース操作が可能となります。
Dockerコンテナにシェルで入ります。

sudo docker exec -it postgres /bin/bash

psqlを起動します。

root@4cbb2fdba2aa:/# /usr/bin/psql -U postgres
psql (12.1 (Debian 12.1-1.pgdg100+1))
Type "help" for help.

クライアントツールのインストール (option)

Dockerコンテナに入らずとも、psqlを作業OSにインストールしてデータベース操作を行うことができます。

$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ sudo apt update
$ sudo apt install ca-certificates
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt update
$ apt list --upgradable
$ sudo apt upgrade
$ sudo apt install postgresql-client-12

バージョン(12)は立ち上げたPostgreSQLに合わせて適宜変更してください。

インストール後は以下のコマンドでPostgreSQLにアクセスできます。

$ psql -h <Docker PostgreSQL IPAddress> -p 5432 -U postgres

ここまでで、Python+Jupyter NotebookからPostgreSQLにアクセスできるようになります。コードサンプルについては、GitHubの拡張子がipynbとなっているJupyter Notebookのファイルを参照してください。

コメント

タイトルとURLをコピーしました