くずきのblog

技術とか色々

Redash + docker-composeでPythonデータソースを使うやり方と外部ライブラリを追加する方法

どうも、くずきです。
Redash + docker-composePythonデータソースを扱う場合に、Pythonのライブラリを追加する機会があったのでメモときます。

今回はid:kakku22が提供している、Redashのハンズオンをベースに構築している。

github.com

Pythonデータソースの追加の仕方

ハンズオンを終え「よっしゃPythonデータソースもつかったろ!!」って意気込み、やろうとしたらまさかのデータソースにPythonがなかった。
ぐぐってみると公式に

Data Sources Options and Requirements · Redash Help Center

For security, the python query runner is disabled by default. To enable, add redash.query_runner.python to the REDASH_ADDITIONAL_QUERY_RUNNERS environmental variable. If you used the bootstrap script, or one of the provided images, add to /opt/redash/.env file the line: export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python

セキュリティ上デフォルトオフにしてるから、使いたかったら.envに追加してねとのことだった。

REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"

docker-compose.ymlに追加する。全部のせるとみづらいため一部だけのせとく。

  server:
    image: redash/redash:2.0.1.b3080
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_WEB_WORKERS: 4
      # 追加
      REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
  worker:
    image: redash/redash:2.0.1.b3080
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      # 追加
      REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_HOST: "http://localhost"

すごいアホだったんだけど、自分はserverの方だけにしか追加してなくて小一時間動かず悩んでました・・。
あとはハンズオン通りに立ち上げると普通にPythonデータソースが使える。

$ docker-compose -f docker-compose.yml up

f:id:kzkohashi:20171209224314p:plain

Pythonの外部ライブラリを追加する

基本的には画像にある、「Modules to import prior to running the script」の項目にPythonで使用したいライブラリ(os, sysなど)をカンマ区切りで追加すればスクリプトを書く時に使用できる。

f:id:kzkohashi:20171209224330j:plain

ただし、外部のライブラリを追加する場合は上記の部分に追加しても使用できない。
調べてみると

github.com

You need to install pandas in the worker container, which actually runs the query.

workerのコンテナにpip installしろってことらしい。
docker-composeでは、commandに追加でスクリプトの実行などができるためそれを利用する。

  server:
    image: redash/redash:2.0.1.b3080
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_WEB_WORKERS: 4
      REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
  worker:
    image: redash/redash:2.0.1.b3080
    # 追加
    # pip installで追加したいライブラリを入れる。
    command: >
      scheduler && 
      basch -c '
      pip install requests requests_oauthlib
      '
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_HOST: "http://localhost"

設定後、起動したら他のライブラリと同じくカンマ区切りでモジュールの追加をしたら利用できる。

感想

RedashというよりDockerの方の知識が必要だったなぁ。
ハンズオンにプルリクしようかな。