Redashについていろいろ調べるときに頭のなかでイメージしている図
draw.ioを試してみたかったので、試してみたついでにメモ。
Flowchart Maker & Online Diagram Software
構成図
間違っているところもあるかもしれないけど、こんな図をイメージしている。
備考
図には書いてないけどRedash ServerはFlask、Redash WorkerはCelery上で動く。このあたりは以下の記事にメモした。
基本的にWorkerしかデータソースに触らない。
ただし、データソース設定画面でTest Connectionした時はServerからデータソースにアクセスする。
Redashのメモリ使用量を節約する
IaaSが一般化してからメモリで悩むことは減りましたが、それでも無駄は減らしたいものです。
この記事ではRedashのメモリ使用量の節約について紹介します。
前提条件
以下の環境で検証しました。
- macOS Sierra 10.12.6
- Docker CE 17.09.1-ce-mac42
- Redash v3.0.0
- ctop
コンテナのメモリ使用量確認にはctopを使用します。
検証準備
$ 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ほどメモリを使用しています。他のコンテナについてはこの記事では扱いません。
ミドルウェアの設定でメモリ使用量を節約する
ミドルウェア周りで調整できそうなものを考えます
- Gunicorn
- Celery
これらの設定は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スプレッドシート、MySQL、PostgreSQL、Google 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を使うということもできると思います。
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
- 作者: 阿佐志保,山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2015/11/20
- メディア: 大型本
- この商品を含むブログ (3件) を見る
Redashで使われているPythonモジュールメモ
Redashのコードを追うときに知っておくとよさそうなモジュールを個人的にメモ。
コミットIDは以下のもので調べたので。バージョン違いなどで差異があると思う。
依存関係を調べる
requirements.txt
を読んでいってもいいけど、 pipdeptree
が便利そうだったので使った。
$ 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
Webアプリケーションフレームワーク。Djangoと並んで有名なのでよく使われている印象。
Redashのサーバーサイドで使われている。
Jinja2
Redashのサーバーサイドのテンプレートエンジン。
Click
Flaskと同じ作者だったはず。
SQLAlchemy
DB周りのいろいろ+ORM。Redashでは以前Peeweeが使われていたけど今はこっち。
Alembic
DBマイグレーションツール。SQLAlchemyと作者が同じっぽい。
Gunicorn
WSGIに対応したアプリケーションサーバー。Flaskはこの上で動いている。
Celery
タスクキュー。RedashのクエリはすべてCelery上で動く。
pystache
MustacheのPython実装。Redashではクエリにパラメータを埋め込むときに使われている。
RestrictedPython
制限付きのPythonを実行するためのモジュール。Pythonデータソースで使われている。
まとめ
データソースに関わるもの以外では、だいたいこなれたモジュールが使われていて、コードを読もうとしたらそれなりに読めるしわかる。というのもRedashの良さの一つかもしれない。
- 作者: 池内孝啓,鈴木たかのり,石本敦夫,小坂健二郎,真嘉比愛
- 出版社/メーカー: 技術評論社
- 発売日: 2015/10/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
2017年まとめ
大晦日なので振り返り。早く書いてゆっくり過ごしたいので、箇条書きでざっくり振り返る。
今年やってたこと
- Redashを去年以上に使うようになった。Redashの活用が進むにつれてインフラ構成を変えたりもした
- Redash絡みでPythonを書くようになった。今ではどの言語よりもPythonを書いている時間が長いと思う。その次はたぶんSQL
- 出張でシンガポールとSFに行った。もうちょっと英語勉強したほうがいいと思いつつやってないので良くない
- 新卒のメンターは3月で終わり。今ではすっかり主戦力になってくれて頼もしい限り
- 社内勉強会もほどほどにやった
ブログ
- たぶんこの記事を含まず27記事。去年よりは少ないっぽい
- Redash Advent Calendar参加もあって12月に10記事以上書いた
- 毎月一番アクセスが多いのは PHPExcelの後継っぽいPhpSpreadsheetでExcelファイルを読み書きするサンプルコード - ariarijp’s blog 。PHPでExcelとか遊び以外ではなんとかして避けたほうがいいと思います
イベント参加
- あまり積極的には参加しなかった
- 登壇はSpeaker Deckを見る限り3回ぐらい
- よく使っているRedashを題材にイベント主催を経験できた。ペースはさておき、Redash使い続けているうちは来年も引続きイベントをやっていきたい
OSS
- Redashなど、仕事で使っているソフトウェアにPRを送ったりした
- 文法も単語もかなり怪しい英語だとは思うけど、去年よりはPRのコメントなどがすっと書けるようになったような気がする
- 自作のツールをいくつかGithubで公開した。 go-zabbix-slack-alert , redash-api-client , crontoc , redashman あたりは仕事でもよく使ってる
買ってよかったもの
- 冷凍室の大きい冷蔵庫
- Ventura(ベンチュラ)伸張昇降テーブル (Maple)
- Fire TV Stick (New モデル)
- 縦型の双子用ベビーカー
- Fire HD 10 タブレット (Newモデル) 64GB、ブラック
- Google Home
- Nintendo Switch Joy-Con (L) ネオンブルー/ (R) ネオンレッド
- ゼルダの伝説 ブレス オブ ザ ワイルド 【オリジナルマリオグッズが抽選で当たるシリアルコード配信(2017/10/26-2018/1/8注文分まで)】 - Switch
Amazonの購入履歴見たところ、今年は過去最多の購入数な気がする。定期おトク便もかなり使った。
Nintendo Switchは久しぶりのゲームコンソール購入だったけど、ゼルダBotWをキッカケにゲーム熱が再燃しつつあって、今はゼノブレイド2を買おうか悩んでる。
Xenoblade2 (ゼノブレイド2) 【オリジナルマリオグッズが抽選で当たるシリアルコード配信(2018/1/8注文分まで)】 - Switch
- 出版社/メーカー: 任天堂
- 発売日: 2017/12/01
- メディア: Video Game
- この商品を含むブログ (6件) を見る
まとめ
- 他にもいろいろあったけど、今年も楽しくやれたと思う
- 自分のキャリアとか方向性は全然考えることがなく、目の前の仕事をひたすらこなしていた。という感じが強くて少し悩みもある
- 去年は英語を課題にしていたけど、1年経ってみてそれほど変わって無い気もするし、少し良くなった気もする。定量的に判断できないので、年1回TOEICを受けるぐらいのことはしておいたほうがいいかもしれない
- 今年はPythonをそれなりに書けるようになったので、来年はJavaScriptを少しがんばってみるかもしれない
- Redashのイベントは早速来月末に予定。ハンズオン以外のイベントも企画する
かなりざっくりだけど、以上でまとめおわり。今年もおつかれさまでした!良いお年を!
Raspberry Pi 2にRedashをインストールする
「Re:dash on Raspbery Pi」という投稿を見かけたので、ちょっとしたお遊びでやってみた。
使用したデバイス
ちょっと古いけど検証にはRaspberry Pi 2 Model Bを使用。Raspberry Pi 3でも動くと思う。
Raspberry Pi 2 Model B (2015年2月発売品)
- 出版社/メーカー: きばん本舗
- メディア: エレクトロニクス
- この商品を含むブログを見る
OSはRaspbian stretch Lite(November 2017)を使いました。
インストール
セットアップスクリプト
Raspbianも名前からしてDebian系なので、RedashのUbuntu向けセットアップスクリプトにすこし改変を加えて使う。
@@ -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
でエラーになるため、cryptography
とpyOpenSSL
のバージョンを上げる- 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;
動いたっぽい。
まとめ
実用上どうするかはさておき、Raspberry Pi上でもRedashは動くということがわかった。 だけど、MicroSDのIOがとにかく遅いのであんまりおすすめしない。