一直在調研一個輕量級開源的 BI 系統。之前我們生產環境使用的 aliyun 的 QuickBi,也調研了另外一個 airflow 的開源商業智能 superset。不得不承認 QuickBI 正在日益完善變得好用,但是因其重量級,不靈活,支持數據源單一(比如普通版本只支持 自建 MySQL | RDS 阿里雲內部的一些組件)superset 有類似問題。不支持 Hive(高級版支持) | Presto 等數據源數據讀取給 QuickBi 的靈活性帶來很多挑戰。
不支持多數據源帶來的困難表現在靈活性上,例如一個數據在集群完成計算之后,我需要再經過清洗 ETL 之后導入新建表 MySQL。給臨時提數 | 可視化覆蓋率 等帶來很多 ETL 上的時間成本。動則半天多則一天時間,可能都浪費在了數據的導來導去的過程之中。
所以基於上面原因,選擇一個輕量級且可以方便定制的 BI 工具會讓效率得到一定提升。
部署到生產環境 (withoud docker)
在選擇部署到生產環境之前,我嘗試了使用 docker 部署了一套環境在測試服。但是服務器經常不知道怎么就被莫名打死,有時候也很卡。所以生產環境我還是嘗試去部署在物理機器上。后來也碰到一些問題,會在下面把這些問題都分享一下。(官方其實是推薦使用 docker 進行部署的,在 18年社區還發生過多次討論,最終 owner 還是提供了部署物理機的方法,我個人不喜歡把簡單的應用多個組件打包部署,不好查問題)
這里我使用的環境是 Aliyun CentOS 7.4
1. 安裝 miniconda
readsh 有幾個比較重要的組件,后端有 Python Flask 有PostgreSQL 有 redis , 前端有 NodeJs 的轉發。首先我們在 CentOs 上為部署 redash 單獨創建 redash 的賬戶 然后為其安裝 miniconda,安裝 miniconda 見 https://www.cnblogs.com/piperck/p/5156493.html, redash 目前的最新版 7.0.0 還在使用 Python 2.7 ,所以要安裝對應的 2.7.x 的 conda 環境。
2. 安裝 PostgreSQL11
根據官網的引導,選擇自己想要安裝的版本和平台。目前最新的版本是 ver11 然后 CentOS7.x 版本
1. yum install 安裝 prm 源 yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 2. 安裝 psql 客戶端包 yum install postgresql11 3. 安裝 postgresql-server yum install postgresql11-server 設置開機啟動和啟動 postgresql /usr/pgsql-11/bin/postgresql-11-setup initdb systemctl enable postgresql-11 systemctl start postgresql-11
3. 安裝 redis
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz $ tar xzf redis-5.0.5.tar.gz $ cd redis-5.0.5 $ make
使用
$ src/redis-server 即可啟動服務器了
4. 安裝或更新 NodeJs
安裝下載 Linux 二進制文件 x64 版本。並參考 NodeJS wiki
解壓 NodeJs 二進制文件到指定路徑
比如 目標地址 /usr/local/lib/nodejs VERSION=v10.15.0 DISTRO=linux-x64 sudo mkdir -p /usr/local/lib/nodejs sudo tar -xJvf node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs
設置環境變量 ~/.proofile or ~/.bashrc
# Nodejs VERSION=v10.15.0 DISTRO=linux-x64 export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH
refresh 環境變量。
測試安裝是否成功
$ node -v
$ npm version
$ npx -v
這里要注意相關版本號的情況。有一些版本的系統里面可能不安靜之前就被人安裝過 node 這里要通過版本號判斷一下是否是用的就是你自己的版本。
設置完成之后做個 ln 到目標地址
sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/node /usr/bin/node sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npm /usr/bin/npm sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npx /usr/bin/npx
如果確認要使用現在的版本可以直接使用 ln -sf 指定。
5. 前端部分
所有環境都安裝完畢之后終於可以愉快的開始啟動項目了
從 git 上 clone 下 redash 並且用 conda source 一個新的環境 使用
pip install -r requirements.txt -r requirements_all_ds.txt
這里的 requirements_all_ds 是大家為 redash 提供的數據源的相關 python 庫。也可以不全部都裝,裝你自己需要使用到的即可。
依托勤勞的社區,使得 redash 可以支持海量的數據源。
使用 npm 安裝前端相關依賴
npm install
npm run build
前端這邊不得不提一點,redash 項目前后端分離。中間依托了前端 node 的一個叫 dev-server 的服務器用於轉發前后端請求。所以當我們在訪問 redash 的時候其實請求會先打到 node 服務器那邊然后再由 node 的服務器進行轉發到后端 flask 服務器。
這里因為我只打算在入口的位置來配置 nginx 服務器,並不打算在 redash 服務器這邊再用 nginx 轉發一下。所以這里我需要配置 redash 的 node 服務器去監聽 0.0.0.0 所有范圍的8080 端口。8080端口是默認的所以我修改了 node 里面的 webpack.config.js 配置指定讓 devServer 監聽 0.0.0.0 地址。
這里不指定 host 默認會監聽 127.0.0.1:8080
devServer: { host: '0.0.0.0', inline: true, index: "/static/index.html", historyApiFallback: {
修改了這里之后我們還需要去 package.json 去修改一個 start 參數去后面追加 --disableHostCheck=true
start": "node --max-http-header-size=16385 ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --disableHostCheck=true
之后我們再使用 npm run start 將前端的服務器啟動起來即可。
6.后端部分
服務器端部分其實有很多值得注意的地方。首先 readsh 給我們的默認配置是默認我們剛才將那些組件都安裝在了同一台機器上面,否則你就必須面臨一個重新配置相關配置參數的局面。好在 redash 將配置文件的修改放在了還算清晰的地方。
如果你沒有在代碼里面添加 .env 文件,所有后端服務啟動的時候會默認去讀取環境變量中的配置。如果環境變量里面沒有配置相關的參數,那么將會直接使用所有參數的默認值加載。
redash 的配置寫在 -> redash/redash/settings/__init__.py 中,這里囊括了所有的配置。如果使用環境變量的配置要到這里來這里參考 key 的名稱。
例如我的 redis 就不是安裝在本地而是直接使用我們服務器集群的 redis 所以我需要重新指定 redis 地址。
# >>>> redash config export REDIS_URL="redis://10.163.13.219:19736/0" export REDASH_THROTTLE_LOGIN_PATTERN="10000/hour" export REDASH_HOST="http://redash.hundun.cn"
我暫時配置了這些參數,第一個是 redis 的訪問地址,第二個是 redash 提供的一個接口頻率限制函數讀取的變量。我這里直接寫得很大,不想去改代碼。否則按照默認值可能經常都能看到這樣的界面 https://discuss.redash.io/t/429-too-many-requests/1013 Too Many Requests。
配置設置好之后可以使用命令 bin/run ./manage.py check_settings 看下現在加載的配置是否是想要的。
7. 數據庫部分
數據庫部分就是使用 psql 客戶端去 PostgreSQL 創建一下 redash 這個賬戶 並且授予相關的權限。由於我還沒有使用過 PostgreSQL 。。。。操作的時候真的非常不習慣。
創建新用戶
postgres=# CREATE USER redash WITH PASSWORD '*****';
這里不配置其他數據庫會默認使用 postgres 這個數據庫
可以使用 psql -d postgres 訪問數據庫。
使用
bin/run ./manage.py database create_tables
自動 mapper 數據表。 redash 在 python 中建立了 orm 模型,並且其使用的 SQLAlchemy 支持直接映射。
8 啟動服務。
我們在 nginx 配置上我們要轉發的 前端 dev_server 地址,然后啟動相關服務。
前端 server npm run staart flask server bin/run ./manage.py runserver --debugger --reload celery server ./bin/run celery worker --app=redash.worker --beat -Qscheduled_queries,queries,celery -c2
即可訪問 redash 的 login 頁面了。到此也就配置完畢了。
需要注意的地方
1. 在整個配置過程中涉及到的部分還是非常多。需要注意前端的 node 環境雖然官方網站上說 npm 6.9 以上即可,但是實際操作中很多包都無法正常安裝,我是重新更新到最新的 node 才完成了安1. 裝。
2. 在配置 setting 的過程中注意仔細檢查各部分參數,並且使用 manage 提供的參數檢查命令來檢查參數是否符合預期。
3. Too Many Requests 上面也提到了,需要配置一下 REDASH_THROTTLE_LOGIN_PATTERN 環境變量來控制這個頻率,不需要的話可以從代碼中將相關控制頻率的地方給刪除掉。
4. 還有 email 的配置,我這里直接使用 postfix 來代理郵件服務,但是我發現如果我啟動郵件服務之后,創建帳號那邊將不再提供設置密碼的操作了,必須要郵箱認證,所以我就先關閉了。
5. 生產環境如果壓力比較大,可以使用 gunicorn 把 wsgi 那邊包一下。 redash 為了提供方便已經將 wsgi 單獨提出來寫了一個文件,並在里面給大家准備好了 app = xxxx。。。。貼心。
6. devServer 報錯
[HPM] Error occurred while trying to proxy request /api/session from redash.hundun.cn to http://localhost:5000/ (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)
參考了一些同樣遇到問題的人,發現 7.0 里面有個配置
proxy: [ { context: [ "/login", "/logout", "/invite", "/setup", "/status.json", "/api", "/oauth" ], target: redashBackend + "/", changeOrigin: false, secure: false }, { context: path => { // CSS/JS for server-rendered pages should be served from backend return /^\/static\/[a-z]+\.[0-9a-fA-F]+\.(css|js)$/.test(path); }, target: redashBackend + "/", changeOrigin: true, secure: false }
這里的 proxy 的第一個元素的 changeOrigin 需要設置為 true,即可解決這個問題。
其實在使用過程中,還覺得蠻順利的。非常好的查詢復用功能,意外的支持一些騷操作比如詞雲,感覺二次開發可以很好的提供的功能會豐富 redash 。
唯一覺得不太好的地方是,后端代碼感覺有點亂。。。包括 import 之類的寫法都很隨意,還沒有整個仔細來看。之后使用過程中如果要進行二次開發,還會再記錄一些有趣的東西。
以上
Reference:
https://github.com/getredash/redash redash github
https://redash.io/help/open-source/dev-guide/setup Developer Installation Guide
https://www.postgresql.org/download/linux/redhat/ PostgreSQL Install
https://redis.io/download Redis Install
https://nodejs.org/zh-cn/download/ LTS NodeJs Install
https://github.com/nodejs/help/wiki/Installation
https://blog.csdn.net/zhangzeyuaaa/article/details/77941039 命令行方式登錄PostgreSQL、創建用戶和數據庫並賦權
https://github.com/saikat/react-apollo-starter-kit/issues/20 [HPM] Error occurred while trying to proxy request / from localhost:3000 to http://localhost:8080