Redashについていろいろ調べるときに頭のなかでイメージしている図

draw.ioを試してみたかったので、試してみたついでにメモ。

Flowchart Maker & Online Diagram Software

構成図

間違っているところもあるかもしれないけど、こんな図をイメージしている。

f:id:ariarijp:20180103223507p:plain

備考

図には書いてないけどRedash ServerはFlask、Redash WorkerはCelery上で動く。このあたりは以下の記事にメモした。

ariarijp.hatenablog.com

基本的にWorkerしかデータソースに触らない。

ただし、データソース設定画面でTest Connectionした時はServerからデータソースにアクセスする。

Redashのメモリ使用量を節約する

IaaSが一般化してからメモリで悩むことは減りましたが、それでも無駄は減らしたいものです。

この記事ではRedashのメモリ使用量の節約について紹介します。

前提条件

以下の環境で検証しました。

コンテナのメモリ使用量確認にはctopを使用します。

github.com

検証準備

$ git clone git@github.com:getredash/redash.git
$ git checkout refs/tags/v3.0.0
$ docker-compose -f docker-compose.production.yml run --rm server create_db
$ docker-compose -f docker-compose.production.yml up

docker-compose.production.yml はRedashのバージョンを以下のように固定しました。

@@ -7,7 +7,7 @@
 version: '2'
 services:
   server:
-    image: redash/redash:latest
+    image: redash/redash:3.0.0.b3147
     command: server
     depends_on:
       - postgres
@@ -23,7 +23,7 @@ services:
       REDASH_WEB_WORKERS: 4
     restart: always
   worker:
-    image: redash/redash:latest
+    image: redash/redash:3.0.0.b3147
     command: scheduler
     environment:
       PYTHONUNBUFFERED: 0

デフォルトのメモリ使用量

ctop で確認します。

   NAME                     CID                      CPU                      MEM                      NET RX/TX                IO R/W                   PIDS

 ◉  redash_nginx_1           e99e574f0b9d                         0%                   1M / 1.95G       816B / 0B                0B / 0B                  2
 ◉  redash_postgres_1        7f190ff29476                         0%                  57M / 1.95G       24K / 14K                0B / 44M                 6
 ◉  redash_redis_1           7423c68518f1                         0%                   1M / 1.95G       26K / 24K                160K / 0B                3
 ◉  redash_server_1          0b2a249270f8                         0%                  348M / 1.95G      3K / 3K                  60K / 0B                 5
 ◉  redash_worker_1          87ee7979b2ad                         0%                  195M / 1.95G      22K / 21K                288K / 12K               4

server が約350MB、 worker が約200MBほどメモリを使用しています。他のコンテナについてはこの記事では扱いません。

ミドルウェアの設定でメモリ使用量を節約する

ミドルウェア周りで調整できそうなものを考えます

これらの設定はRedashの環境変数で変更できるので、以下のように docker-compose.production.yml を変更します。

@@ -7,7 +7,7 @@
 version: '2'
 services:
   server:
-    image: redash/redash:latest
+    image: redash/redash:3.0.0.b3147
     command: server
     depends_on:
       - postgres
@@ -20,10 +20,10 @@ services:
       REDASH_REDIS_URL: "redis://redis:6379/0"
       REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
       REDASH_COOKIE_SECRET: veryverysecret
-      REDASH_WEB_WORKERS: 4
+      REDASH_WEB_WORKERS: 1
     restart: always
   worker:
-    image: redash/redash:latest
+    image: redash/redash:3.0.0.b3147
     command: scheduler
     environment:
       PYTHONUNBUFFERED: 0
@@ -31,7 +31,7 @@ services:
       REDASH_REDIS_URL: "redis://redis:6379/0"
       REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
       QUEUES: "queries,scheduled_queries,celery"
-      WORKERS_COUNT: 2
+      WORKERS_COUNT: 1
     restart: always
   redis:
     image: redis:3.0-alpine

再度コンテナを作り直して、Redashを起動します。

$ docker-compose -f docker-compose.production.yml rm
$ docker-compose -f docker-compose.production.yml run --rm server create_db
$ docker-compose -f docker-compose.production.yml up

ctop で確認します。

   NAME                     CID                      CPU                      MEM                      NET RX/TX                IO R/W                   PIDS

 ◉  redash_nginx_1           a063c735099a                         0%                   1M / 1.95G       992B / 0B                0B / 0B                  2
 ◉  redash_postgres_1        26fdae3b9f2c                         0%                  59M / 1.95G       27K / 18K                0B / 44M                 7
 ◉  redash_redis_1           433f533a2bc3                         0%                   1M / 1.95G       52K / 43K                0B / 0B                  3
 ◉  redash_server_1          71fd4978d9a8                         0%                  101M / 1.95G      1K / 1K                  0B / 0B                  2
 ◉  redash_worker_1          dab363fafcab                         0%                  168M / 1.95G      45K / 51K                0B / 16K                 3

server が約100MB、 worker が約170MBほどメモリを使用しています。実用上どこまで詰めていいかは使いながら調整になりますが、ミドルウェアのプロセス数調整は効果がありそうです。

Redashの設定ファイルを変更してメモリ使用量を節約する

もうすこし切り詰めていきます。

Redashの設定はたいてい環境変数で変更可能ですが redash/settings.py のみで変更できるものもあるので、その設定を変更します。

データソースの種類を減らす

Redashの利点のひとつは、多くのデータソースに対応していることですが、どのデータソースを利用可能にするかは redash/settings.py に定義されています。

試しに、BigQuery、GoogleスプレッドシートMySQLPostgreSQLGoogle Analytics、Query Resultsだけを使用するように設定を変更します。

@@ -199,30 +199,11 @@ ACCESS_CONTROL_ALLOW_HEADERS = os.environ.get("REDASH_CORS_ACCESS_CONTROL_ALLOW_

 # Query Runners
 default_query_runners = [
-    'redash.query_runner.athena',
     'redash.query_runner.big_query',
     'redash.query_runner.google_spreadsheets',
-    'redash.query_runner.graphite',
-    'redash.query_runner.mongodb',
     'redash.query_runner.mysql',
     'redash.query_runner.pg',
-    'redash.query_runner.url',
-    'redash.query_runner.influx_db',
-    'redash.query_runner.elasticsearch',
-    'redash.query_runner.presto',
-    'redash.query_runner.hive_ds',
-    'redash.query_runner.impala_ds',
-    'redash.query_runner.vertica',
-    'redash.query_runner.clickhouse',
-    'redash.query_runner.treasuredata',
-    'redash.query_runner.sqlite',
-    'redash.query_runner.dynamodb_sql',
-    'redash.query_runner.mssql',
-    'redash.query_runner.memsql_ds',
-    'redash.query_runner.jql',
     'redash.query_runner.google_analytics',
-    'redash.query_runner.axibase_tsd',
-    'redash.query_runner.salesforce',
     'redash.query_runner.query_results'
 ]

再度コンテナを作り直し、設定をコンテナにコピーしてからRedashを起動します。

$ docker-compose -f docker-compose.production.yml rm
$ docker-compose -f docker-compose.production.yml create
$ docker cp redash/settings.py redash_worker_1:/app/redash/settings.py
$ docker cp redash/settings.py redash_server_1:/app/redash/settings.py
$ docker-compose -f docker-compose.production.yml run --rm server create_db
$ docker-compose -f docker-compose.production.yml up

ctop で確認します。

   NAME                   CID                    CPU                    MEM                    NET RX/TX              IO R/W                 PIDS

 ◉  redash_nginx_1         f821d84a023a                      0%                 1M / 1.95G      886B / 0B              0B / 0B                2
 ◉  redash_postgres_1      2270aa342a0c                      0%                57M / 1.95G      25K / 15K              0B / 43M               6
 ◉  redash_redis_1         1315adf2f232                      0%                 1M / 1.95G      29K / 26K              0B / 0B                3
 ◉  redash_server_1        53b407a5f23b                      0%                79M / 1.95G      1K / 1006B             0B / 0B                2
 ◉  redash_worker_1        6452b35d9227                      0%                132M / 1.95G     25K / 25K              0B / 12K               3

server が約80MB、 worker が約130MBほどメモリを使用しています。不要なデータソース対応を切り詰めるのもメモリ消費量節約に効果がありそうです。

プロセス数をデフォルトに戻す

データソース対応を減らした状態で、プロセス数はもとに戻してみます。

$ docker-compose -f docker-compose.production.yml rm
$ docker-compose -f docker-compose.production.yml create
$ docker cp redash/settings.py redash_worker_1:/app/redash/settings.py
$ docker cp redash/settings.py redash_server_1:/app/redash/settings.py
$ docker-compose -f docker-compose.production.yml run --rm server create_db
$ docker-compose -f docker-compose.production.yml up

ctop で確認します。

   NAME                   CID                    CPU                    MEM                    NET RX/TX              IO R/W                 PIDS

 ◉  redash_nginx_1         d76e0f2476be                      0%                 1M / 1.95G      816B / 0B              0B / 0B                2
 ◉  redash_postgres_1      808563ad0d67                      0%                57M / 1.95G      24K / 15K              0B / 43M               6
 ◉  redash_redis_1         91ebe6d65268                      0%                 1M / 1.95G      27K / 25K              0B / 0B                3
 ◉  redash_server_1        f0adc13795f5                      0%                269M / 1.95G     3K / 3K                0B / 0B                5
 ◉  redash_worker_1        bebaf0d04026                      0%                159M / 1.95G     23K / 22K              76K / 12K              4

server が約270MB、 worker が約160MBほどメモリを使用しています。

データソース対応を減らすだけでも、デフォルトと比較して server で約80MB、 worker で約40MBほどメモリ使用量を節約できました。

プロセス数などはRedashの利用状況にあわせてチューニングしなければいけない一方、データソース対応は比較的気軽に変更できることが多いので、Redashの導入や設定見直しの際は確認してみることをおすすめします。

まとめ

RedashはRaspberry Piでも動くという記事を書きましたが、メモリ使用量は少ないに越したことはありません。

節約できたぶんをGunicornやCeleryに割り当て、さらに快適にRedashを使うということもできると思います。

Redashで使われているPythonモジュールメモ

Redashのコードを追うときに知っておくとよさそうなモジュールを個人的にメモ。

コミットIDは以下のもので調べたので。バージョン違いなどで差異があると思う。

github.com

依存関係を調べる

requirements.txt を読んでいってもいいけど、 pipdeptree が便利そうだったので使った。

github.com

$ pipdeptree
celery==3.1.23
  - billiard [required: >=3.3.0.23,<3.4, installed: 3.3.0.23]
  - kombu [required: <3.1,>=3.0.34, installed: 3.0.37]
    - amqp [required: >=1.4.9,<2.0, installed: 1.4.9]
    - anyjson [required: >=0.3.3, installed: 0.3.3]
  - pytz [required: >dev, installed: 2016.7]
Flask-Admin==1.4.2
  - Flask [required: >=0.7, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - wtforms [required: Any, installed: 2.1]
Flask-Limiter==0.9.3
  - Flask [required: >=0.8, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - limits [required: Any, installed: 1.2.1]
    - six [required: >=1.4.1, installed: 1.10.0]
  - six [required: >=1.4.1, installed: 1.10.0]
Flask-Login==0.4.0
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
Flask-Mail==0.9.1
  - blinker [required: Any, installed: 1.3]
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
Flask-Migrate==2.0.1
  - alembic [required: >=0.6, installed: 0.9.6]
    - Mako [required: Any, installed: 1.0.7]
      - MarkupSafe [required: >=0.9.2, installed: 0.23]
    - python-dateutil [required: Any, installed: 2.4.2]
      - six [required: >=1.5, installed: 1.10.0]
    - python-editor [required: >=0.3, installed: 1.0.3]
    - SQLAlchemy [required: >=0.7.6, installed: 1.1.4]
  - Flask [required: >=0.9, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - Flask-Script [required: >=0.6, installed: 2.0.6]
    - Flask [required: Any, installed: 0.11.1]
      - click [required: >=2.0, installed: 6.6]
      - itsdangerous [required: >=0.21, installed: 0.24]
      - Jinja2 [required: >=2.4, installed: 2.8]
        - MarkupSafe [required: Any, installed: 0.23]
      - Werkzeug [required: >=0.7, installed: 0.11.11]
  - Flask-SQLAlchemy [required: >=1.0, installed: 2.1]
    - Flask [required: >=0.10, installed: 0.11.1]
      - click [required: >=2.0, installed: 6.6]
      - itsdangerous [required: >=0.21, installed: 0.24]
      - Jinja2 [required: >=2.4, installed: 2.8]
        - MarkupSafe [required: Any, installed: 0.23]
      - Werkzeug [required: >=0.7, installed: 0.11.11]
    - SQLAlchemy [required: >=0.7, installed: 1.1.4]
Flask-OAuthlib==0.9.3
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - oauthlib [required: >=0.6.2, installed: 2.0.6]
  - requests-oauthlib [required: >=0.5.0, installed: 0.8.0]
    - oauthlib [required: >=0.6.2, installed: 2.0.6]
    - requests [required: >=2.0.0, installed: 2.11.1]
Flask-RESTful==0.3.5
  - aniso8601 [required: >=0.82, installed: 1.1.0]
    - python-dateutil [required: Any, installed: 2.4.2]
      - six [required: >=1.5, installed: 1.10.0]
  - Flask [required: >=0.8, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - pytz [required: Any, installed: 2016.7]
  - six [required: >=1.3.0, installed: 1.10.0]
Flask-SSLify==0.1.5
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
funcy==1.7.1
gunicorn==19.7.1
honcho==0.5.0
httplib2==0.10.3
jsonschema==2.4.0
parsedatetime==2.1
passlib==1.6.2
pipdeptree==0.10.1
  - pip [required: >=6.0.0, installed: 9.0.1]
psycopg2==2.7.3.2
pysaml2==2.4.0
  - argparse [required: Any, installed: 1.1]
  - decorator [required: Any, installed: 4.1.2]
  - paste [required: Any, installed: 2.0.3]
    - six [required: >=1.4.0, installed: 1.10.0]
  - pycrypto [required: >=2.2, installed: 2.6.1]
  - pyOpenSSL [required: Any, installed: 16.2.0]
    - cryptography [required: >=1.3.4, installed: 2.0.2]
      - asn1crypto [required: >=0.21.0, installed: 0.24.0]
      - cffi [required: >=1.7, installed: 1.11.2]
        - pycparser [required: Any, installed: 2.18]
      - enum34 [required: Any, installed: 1.1.6]
      - idna [required: >=2.1, installed: 2.6]
      - ipaddress [required: Any, installed: 1.0.19]
      - six [required: >=1.4.1, installed: 1.10.0]
    - six [required: >=1.5.2, installed: 1.10.0]
  - python-dateutil [required: Any, installed: 2.4.2]
    - six [required: >=1.5, installed: 1.10.0]
  - pytz [required: Any, installed: 2016.7]
  - repoze.who [required: Any, installed: 2.3]
    - setuptools [required: Any, installed: 38.2.5]
    - WebOb [required: Any, installed: 1.7.4]
    - zope.interface [required: Any, installed: 4.4.3]
      - setuptools [required: Any, installed: 38.2.5]
  - requests [required: >=1.0.0, installed: 2.11.1]
  - zope.interface [required: Any, installed: 4.4.3]
    - setuptools [required: Any, installed: 38.2.5]
pystache==0.5.4
raven==6.0.0
  - contextlib2 [required: Any, installed: 0.5.5]
redis==2.10.5
RestrictedPython==3.6.0
  - setuptools [required: Any, installed: 38.2.5]
semver==2.2.1
simplejson==3.10.0
sqlparse==0.1.8
statsd==2.1.2
wheel==0.24.0
XlsxWriter==0.9.3

(自分にとって)重要そうなモジュール

Flask

github.com

WebアプリケーションフレームワークDjangoと並んで有名なのでよく使われている印象。

Redashのサーバーサイドで使われている。

Jinja2

github.com

Redashのサーバーサイドのテンプレートエンジン。

Click

github.com

CLI作成ツール。RedashのCLIでも使われている。

Flaskと同じ作者だったはず。

SQLAlchemy

github.com

DB周りのいろいろ+ORM。Redashでは以前Peeweeが使われていたけど今はこっち。

Alembic

bitbucket.org

DBマイグレーションツール。SQLAlchemyと作者が同じっぽい。

Gunicorn

github.com

WSGIに対応したアプリケーションサーバー。Flaskはこの上で動いている。

Celery

github.com

タスクキュー。RedashのクエリはすべてCelery上で動く。

pystache

github.com

MustacheのPython実装。Redashではクエリにパラメータを埋め込むときに使われている。

RestrictedPython

github.com

制限付きのPythonを実行するためのモジュール。Pythonデータソースで使われている。

まとめ

データソースに関わるもの以外では、だいたいこなれたモジュールが使われていて、コードを読もうとしたらそれなりに読めるしわかる。というのもRedashの良さの一つかもしれない。

Python ライブラリ厳選レシピ

Python ライブラリ厳選レシピ

2017年まとめ

大晦日なので振り返り。早く書いてゆっくり過ごしたいので、箇条書きでざっくり振り返る。

今年やってたこと

  • Redashを去年以上に使うようになった。Redashの活用が進むにつれてインフラ構成を変えたりもした
  • Redash絡みでPythonを書くようになった。今ではどの言語よりもPythonを書いている時間が長いと思う。その次はたぶんSQL
  • 出張でシンガポールとSFに行った。もうちょっと英語勉強したほうがいいと思いつつやってないので良くない
  • 新卒のメンターは3月で終わり。今ではすっかり主戦力になってくれて頼もしい限り
  • 社内勉強会もほどほどにやった

ブログ

イベント参加

  • あまり積極的には参加しなかった
  • 登壇はSpeaker Deckを見る限り3回ぐらい
  • よく使っているRedashを題材にイベント主催を経験できた。ペースはさておき、Redash使い続けているうちは来年も引続きイベントをやっていきたい

OSS

  • Redashなど、仕事で使っているソフトウェアにPRを送ったりした
  • 文法も単語もかなり怪しい英語だとは思うけど、去年よりはPRのコメントなどがすっと書けるようになったような気がする
  • 自作のツールをいくつかGithubで公開した。 go-zabbix-slack-alert , redash-api-client , crontoc , redashman あたりは仕事でもよく使ってる

買ってよかったもの

Amazonの購入履歴見たところ、今年は過去最多の購入数な気がする。定期おトク便もかなり使った。

Nintendo Switchは久しぶりのゲームコンソール購入だったけど、ゼルダBotWをキッカケにゲーム熱が再燃しつつあって、今はゼノブレイド2を買おうか悩んでる。

まとめ

  • 他にもいろいろあったけど、今年も楽しくやれたと思う
  • 自分のキャリアとか方向性は全然考えることがなく、目の前の仕事をひたすらこなしていた。という感じが強くて少し悩みもある
  • 去年は英語を課題にしていたけど、1年経ってみてそれほど変わって無い気もするし、少し良くなった気もする。定量的に判断できないので、年1回TOEICを受けるぐらいのことはしておいたほうがいいかもしれない
  • 今年はPythonをそれなりに書けるようになったので、来年はJavaScriptを少しがんばってみるかもしれない
  • Redashのイベントは早速来月末に予定。ハンズオン以外のイベントも企画する

かなりざっくりだけど、以上でまとめおわり。今年もおつかれさまでした!良いお年を!

Raspberry Pi 2にRedashをインストールする

「Re:dash on Raspbery Pi」という投稿を見かけたので、ちょっとしたお遊びでやってみた。

discuss.redash.io

使用したデバイス

ちょっと古いけど検証にはRaspberry Pi 2 Model Bを使用。Raspberry Pi 3でも動くと思う。

Raspberry Pi 2 Model B (2015年2月発売品)

Raspberry Pi 2 Model B (2015年2月発売品)

OSはRaspbian stretch Lite(November 2017)を使いました。

www.raspberrypi.org

インストール

セットアップスクリプト

Raspbianも名前からしDebian系なので、RedashのUbuntu向けセットアップスクリプトにすこし改変を加えて使う。

github.com

@@ -41,7 +41,7 @@
     # Base packages
     apt install -y python-pip python-dev nginx curl build-essential pwgen
     # Data sources dependencies:
-    apt install -y libffi-dev libssl-dev libmysqlclient-dev libpq-dev freetds-dev libsasl2-dev
+    apt install -y libffi-dev libssl-dev libmariadbclient-dev libpq-dev freetds-dev libsasl2-dev
     # SAML dependency
     apt install -y xmlsec1
     # Storage servers
@@ -71,6 +71,9 @@
 }
 
 install_python_packages() {
+    sed -i 's/cryptography==1.4/cryptography==2.1.4/' /opt/redash/current/requirements.txt
+    sed -i 's/pyOpenSSL==0.14/pyOpenSSL==16.2.0/' /opt/redash/current/requirements_all_ds.txt
+    sed -i 's/cassandra-driver==3.1.1/#cassandra-driver==3.1.1/' /opt/redash/current/requirements_all_ds.txt
     pip install --upgrade pip
     # TODO: venv?
     pip install setproctitle # setproctitle is used by Celery for "pretty" process titles

変更点は以下の通り。

  • Raspbian StretchはMySQLではなくMariaDBを使うのが標準なので、 libmysqlclient-dev ではなく libmariadbclient-dev を使う
  • pip install でエラーになるため、 cryptographypyOpenSSL のバージョンを上げる
  • Cassandra データソースはデフォルトで有効になっていないわりに依存ライブラリのビルドに時間がかかるのでコメントアウト

RaspbianにRedashをインストール

セットアップスクリプトをRaspbianをクリーンインストールしたRaspberry Piに転送し、実行する。

$ sudo bash bootstrap.sh.raspi

そのまま動いてくれればいいのだけれど、以下のようなエラーが pip あたりで起きて止まる。

TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

pip の設定やオプションで解決したかったけど、解決方法が特定できなかったので pip install を何度か実行して成功するまで繰り返した。

PIP_DEFAULT_TIMEOUT を長めにしておくと少しエラーが減った気がするが、気のせいかもしれない。

$ export PIP_DEFAULT_TIMEOUT=600
$ sudo pip install -r /opt/redash/current/requirements.txt
$ sudo pip install -r /opt/redash/current/requirements_all_ds.txt

pip install が実行できたら、 /opt/redash を削除してから再度セットアップスクリプトを実行する。

pip install は先の手順で実行済みなので割と早く終わるはず。

$ sudo rm -rf /opt/redash
$ sudo bash bootstrap.sh.raspi

これでRedashが起動するので、ブラウザで http://raspberrypi.local/setup など、Raspberry PiのURLにアクセスしてadminユーザーを作る。

動作確認

SQLiteでさくっと動作確認。

$ cd /tmp
$ wget https://github.com/wallymathieu/sakila-sample-database-ports/raw/master/sqlite-sakila-db/sqlite-sakila.sq

SQLiteデータソースを作成してから、以下のクエリを実行してみる。

SELECT * FROM actor LIMIT 10;

f:id:ariarijp:20171229235740p:plain

動いたっぽい。

まとめ

実用上どうするかはさておき、Raspberry Pi上でもRedashは動くということがわかった。 だけど、MicroSDのIOがとにかく遅いのであんまりおすすめしない。