系統(tǒng)環(huán)境:Windows 10
Python:3.6.6
Superset:0.27.0
0 Superset 簡(jiǎn)介
??Superset 是一款由 Airbnb 開源的“現(xiàn)代化的企業(yè)級(jí) BI(商業(yè)智能) Web 應(yīng)用程序”,其通過創(chuàng)建和分享 dashboard,為數(shù)據(jù)分析提供了輕量級(jí)的數(shù)據(jù)查詢和可視化方案堕扶。
??Superset 的前端主要用到了 React 和 NVD3/D3,而后端則基于 Python 的 Flask 框架和 Pandas库快、SQLAlchemy 等依賴庫(kù),主要提供了這幾方面的功能:
- 集成數(shù)據(jù)查詢功能钥顽,支持多種數(shù)據(jù)庫(kù),包括 MySQL靠汁、PostgresSQL蜂大、Oracle、SQL Server蝶怔、SQLite奶浦、SparkSQL 等,并深度支持 Druid踢星。
- 通過 NVD3/D3 預(yù)定義了多種可視化圖表澳叉,滿足大部分的數(shù)據(jù)展示功能。如果還有其他需求沐悦,也可以自開發(fā)更多的圖表類型成洗,或者嵌入其他的 JavaScript 圖表庫(kù)(如 HighCharts、ECharts)藏否。
- 提供細(xì)粒度安全模型瓶殃,可以在功能層面和數(shù)據(jù)層面進(jìn)行訪問控制。支持多種鑒權(quán)方式(如數(shù)據(jù)庫(kù)副签、OpenID遥椿、LDAP基矮、OAuth、REMOTE_USER 等)冠场。
??Superset 的搭建與使用非常簡(jiǎn)單家浇,只需要一些 Python 基礎(chǔ),下面先從創(chuàng)建虛擬環(huán)境開始碴裙。
1 創(chuàng)建虛擬環(huán)境
??Superset 的依賴包較多钢悲,為了避免沖突,需要先搭建虛擬環(huán)境青团,再進(jìn)行安裝譬巫,這里推薦使用 Anaconda 自帶的 conda 工具創(chuàng)建虛擬環(huán)境:
conda create -n superset python=3.6
??創(chuàng)建虛擬環(huán)境成功后,啟動(dòng)虛擬環(huán)境:
activate superset
2 安裝
??使用豆瓣源安裝 Superset:
pip install superset -i https://pypi.douban.com/simple
??這里遇到了一個(gè)坑督笆,某個(gè)依賴包沒有被正確的安裝芦昔,當(dāng)時(shí)隨手就解決了,沒有記錄下來娃肿。只大概記得報(bào)錯(cuò)信息提到 Microsoft Visual C++ 14.0 is required
咕缎,這是因?yàn)樵撘蕾嚢枰惭b C++ 進(jìn)行編譯。
??一般不用為此專門安裝 Microsoft Visual C++ 14.0料扰,而是去下載該依賴包的 whl 格式文件(需要對(duì)應(yīng)虛擬環(huán)境的 python 版本)凭豪,再進(jìn)入 whl 文件所在的路徑通過 pip install
安裝即可。如果在安裝過程中遇到其他問題晒杈,就把報(bào)錯(cuò)信息復(fù)制出來嫂伞,然后去問問神奇的 stackoverflow 吧!
3 初始化
??初始化的官方步驟如下:
# 創(chuàng)建管理員賬號(hào)
fabmanager create-admin --app superset
# 初始化數(shù)據(jù)庫(kù)
superset db upgrade
# 載入案例數(shù)據(jù)
superset load_examples
# 初始化角色和權(quán)限
superset init
# 啟動(dòng)服務(wù)拯钻,端口號(hào) 8088帖努,使用 -p 更改端口號(hào)
superset runserver
??但在命令行中直接運(yùn)行 superset
, 會(huì)提示“不是內(nèi)部或外部命令”粪般。要解決這個(gè)問題拼余,可以直接通過 cd
命令進(jìn)入 Superset 安裝目錄( ...\Anaconda3\envs\superset\Lib\site-packages\superset\bin )。然后運(yùn)行如下命令:
python superset db upgrade
python superset load_examples
python superset init
python superset runserver
??這里直接運(yùn)行 python superset runserver
會(huì)出錯(cuò)亩歹,原因是 Superset 使用 gunicorn 作為應(yīng)用程序服務(wù)器匙监,而 gunicorn 不支持 Windows。需要在命令行中添加 -d
小作,使用 development web server 運(yùn)行亭姥。最終運(yùn)行命令為:
python superset runserver -d
??但是這種部署方式,官方并不建議在生產(chǎn)環(huán)境中使用躲惰。在 Superset 的 issues 922致份,有人提供了一種方法,使用 waitress础拨。首先安裝 waitress:
pip install waitress
??接著找到 superset/cil.py 的 debug_run()
函數(shù):
def debug_run(app, port, use_reloader):
app.run(
host='0.0.0.0',
port=int(port),
threaded=True,
debug=True,
use_reloader=use_reloader)
??將其改寫成:
def debug_run(app, port):
from waitress import serve #使用 waitress 解決 gunicorn 不支持 windows 問題
return serve(
app,
host='0.0.0.0',
port=int(port))
??再次運(yùn)行 Superset:
python superset runserver -d -p 8079
??最后在瀏覽器輸入 http://localhost:8079
進(jìn)入登錄界面:
??輸入在 fabmanager create-admin --app superset
這步設(shè)置的賬號(hào)和密碼登錄氮块,進(jìn)入 Superset 首頁(yè)(右上角國(guó)旗處可設(shè)置語(yǔ)言):
??這里 Superset 已經(jīng)用之前加載的示例數(shù)據(jù)绍载,建立了 4 個(gè) dashboard,選擇其中一個(gè)進(jìn)行查看(即本文開始的那個(gè) dashboard):
4 數(shù)據(jù)源
??接下來滔蝉,將演示如何連接數(shù)據(jù)庫(kù)击儡,以及怎樣使用表和導(dǎo)入 CSV 到數(shù)據(jù)庫(kù)。Superset 還深度支持 Druid(一個(gè)高效的海量數(shù)據(jù)查詢系統(tǒng))蝠引,但這里不做介紹阳谍。
4.1 連接到數(shù)據(jù)庫(kù)
??從頂部導(dǎo)航菜單的 Source — Databases 進(jìn)入數(shù)據(jù)庫(kù)列表頁(yè):
??點(diǎn)擊在數(shù)據(jù)庫(kù)列表右上角的綠色加號(hào)按鈕:
??點(diǎn)擊按鈕后,將進(jìn)入添加數(shù)據(jù)庫(kù)的表單頁(yè)螃概,因?yàn)檫@只是一次簡(jiǎn)單的演示矫夯,只需要填寫兩項(xiàng):Database 和 SQLAlchemy URL,分別是數(shù)據(jù)庫(kù)名稱和 SQLAlchemy 的連接 URI (參閱為目標(biāo)數(shù)據(jù)庫(kù)創(chuàng)建連接 URI 的 SQLAlchemy 文檔)吊洼。
這里為了方便训貌,用的是本地的 SQLite 數(shù)據(jù)庫(kù)。也可以使用其他數(shù)據(jù)庫(kù)冒窍,如官方文檔推薦的 PostgreSQL 的一些示例數(shù)據(jù)集或官方文檔使用的示例天氣數(shù)據(jù)递沪。
??接著點(diǎn)擊 Test Connection 按鈕,測(cè)試是否能成功連接到數(shù)據(jù)庫(kù)综液。若成功連接款慨,則會(huì)看到下圖的彈出框:
??當(dāng)連接測(cè)試成功后,可在頁(yè)面底部看到該數(shù)據(jù)庫(kù)下的數(shù)據(jù)表谬莹,點(diǎn)擊 Save 按鈕檩奠,完成創(chuàng)建。
4.2 創(chuàng)建表
??現(xiàn)在已經(jīng)配置了數(shù)據(jù)庫(kù)附帽,接下來需要向 Superset 添加想要查詢的特定表笆凌。從 Sources — Tables 進(jìn)入到數(shù)據(jù)表列表頁(yè):
??點(diǎn)擊列表頁(yè)右上角的綠色加號(hào)按鈕:
??點(diǎn)擊按鈕后,將進(jìn)入添加數(shù)據(jù)表的表單頁(yè)士葫,在該頁(yè)面依次填寫目標(biāo)數(shù)據(jù)庫(kù)未桥、數(shù)據(jù)表名稱撒顿、數(shù)據(jù)庫(kù)模式(可選),再點(diǎn)擊 Save 按鈕开镣,即可完成創(chuàng)建欠啤。
??創(chuàng)建完成后荚藻,將重定向回到列表頁(yè),此時(shí)在頁(yè)面頂部會(huì)出現(xiàn)一條消息提示指示表已創(chuàng)建:
??在列表頁(yè)還可以對(duì)已添加的數(shù)據(jù)表進(jìn)行編輯:
??點(diǎn)擊編輯圖標(biāo)洁段,可進(jìn)入表的編輯頁(yè)应狱,對(duì)表的詳細(xì)信息、字段祠丝、指標(biāo)進(jìn)行配置疾呻,這里演示對(duì)表字段的配置(設(shè)置是否可對(duì)指定字段進(jìn)行分組或過濾):
4.3 上傳 CSV
??Superset 還可以導(dǎo)入 CSV 到數(shù)據(jù)庫(kù)中除嘹,從 Sources — Upload a CSV 進(jìn)入到導(dǎo)入 CSV 的表單頁(yè):
??依次填寫表名稱、導(dǎo)入 CSV 文件岸蜗、選擇要導(dǎo)入的數(shù)據(jù)庫(kù)尉咕,再點(diǎn)擊 Save 按鈕完成導(dǎo)入:
??創(chuàng)導(dǎo)入完成后,將重定向回到數(shù)據(jù)表列表頁(yè)璃岳,此時(shí)在頁(yè)面頂部會(huì)出現(xiàn)一條消息提示指示表已創(chuàng)建:
5 創(chuàng)建 dashboard
5.1 探索數(shù)據(jù)
??要開始探索數(shù)據(jù)年缎,只需在可用數(shù)據(jù)表列表中點(diǎn)擊剛剛創(chuàng)建的表名:
??點(diǎn)擊表名后進(jìn)入表的可視化頁(yè)面,默認(rèn)的可視化類型為表視圖:
??在 Datasouce & Chart Type 下方铃慷,依次可以進(jìn)行時(shí)間单芜、Group By、Not Group By 以及字段過濾等設(shè)置:
??在頁(yè)面左側(cè)完成相關(guān)設(shè)置后犁柜,點(diǎn)擊 Run Query 按鈕洲鸠,即可在右側(cè)的可視化視圖,查看數(shù)據(jù)的可視化展示:
5.2 創(chuàng)建圖表
??通過更改可視化類型和其他設(shè)置赁温,可以很靈活地對(duì)數(shù)據(jù)進(jìn)行探索性分析坛怪。若在探索的過程中發(fā)現(xiàn)某個(gè)有價(jià)值的點(diǎn),可以點(diǎn)擊左上角的 Save 按鈕股囊,在出現(xiàn)的彈出框中命名圖表并選擇是否將其添加到 dashboard袜匿,以將其保存為圖表:
??從頂部導(dǎo)航菜單的 Charts 進(jìn)入到圖表的列表頁(yè),找到剛剛創(chuàng)建的圖表:
??點(diǎn)擊圖表名稱進(jìn)入到剛才的可視化頁(yè)面稚疹,對(duì)已保存的圖表進(jìn)行再次編輯居灯。
5.3 創(chuàng)建 dashboard
??從頂部導(dǎo)航菜單的 Dashboards 進(jìn)入到 dashboard 的列表頁(yè),點(diǎn)擊右上角的綠色加號(hào)按鈕:
??點(diǎn)擊按鈕后内狗,將進(jìn)入添加 dashboard 的表單頁(yè)怪嫌,在該頁(yè)面依次填寫 dashboard 名稱和擁有者,再點(diǎn)擊 Save 按鈕柳沙,即可完成創(chuàng)建:
5.4 編輯 dashboard
??完成 dashboard 的創(chuàng)建后岩灭,將重定向到 dashboard 的列表頁(yè),找到剛創(chuàng)建的 dashboard:
??點(diǎn)擊 dashboard 的名稱赂鲤,進(jìn)入 dashboard噪径,此時(shí) dashboard 還未配置任何圖表,處于空值狀態(tài)数初,點(diǎn)擊右上角的 Edit dashboard 按鈕進(jìn)行編輯:
??進(jìn)入編輯狀態(tài)后找爱,可已導(dǎo)入圖表(僅限 dashboard 擁有者擁有的圖表)、標(biāo)簽頁(yè)泡孩、行车摄、列、標(biāo)題、Markdown 和分割線等組件:
??并可通過拖拽編輯 dashboard 的布局(在拖拽過程中吮播,Superset 還提供了輔助線和柵格進(jìn)行提示):
??Superset 還可以通過編輯 CSS 修改 dashboard 的樣式:
??在進(jìn)行編輯之后变屁,點(diǎn)擊 Save changes 按鈕,即可完成操作薄料。
6 SQL 查詢
??在使用 SQL 查詢前敞贡,需要進(jìn)行兩項(xiàng)設(shè)置:
??首先,從頂部導(dǎo)航菜單的 Sources — Databases 進(jìn)入數(shù)據(jù)庫(kù)的列表頁(yè)摄职,選中數(shù)據(jù)庫(kù)進(jìn)行編輯誊役,將 Expose in SQL Lab 和 Allow Run Sync 都勾選上,其余的不要勾選谷市。
??在勾選完上述兩項(xiàng)之后蛔垢,Windows 用戶還會(huì)出現(xiàn) “module" object has no attribute 'SIGALRM'
錯(cuò)誤,這又是由于 Windows 環(huán)境下依賴包不兼容導(dǎo)致的 —— Python 的 signal 包只作用于 Linux 和 Mac 迫悠,在 Windows 下不啟作用鹏漆。解決方法很簡(jiǎn)單粗暴,在 superset/utils.py 下找到相關(guān)代碼创泄,把 signal
所在行都注釋艺玲,然后再加上一個(gè) pass
(這塊代碼的功能是在超時(shí)后將查詢進(jìn)程殺掉,注釋后沒大影響)鞠抑。
def __enter__(self):
try:
pass
#signal.signal(signal.SIGALRM, self.handle_timeout)
#signal.alarm(self.seconds)
except ValueError as e:
logging.warning("timeout can't be used in the current context")
logging.exception(e)
def __exit__(self, type, value, traceback):
try:
pass
#signal.alarm(0)
except ValueError as e:
logging.warning("timeout can't be used in the current context")
logging.exception(e)
??上面兩步做完后饭聚,即可在 SQL Lab — SQL Editor 進(jìn)行 SQL 查詢操作:
??可對(duì)查詢語(yǔ)句進(jìn)行執(zhí)行、保存搁拙、分享(復(fù)制)操作秒梳,還可以對(duì)查詢結(jié)果可以進(jìn)行可視化和導(dǎo)出為 CSV 文件。
7 安全性
??Superset 中的安全性由 Flask AppBuilder(FAB)處理(一個(gè)“簡(jiǎn)單快速的應(yīng)用程序開發(fā)框架箕速,構(gòu)建在Flask之上”)酪碘。FAB 提供身份驗(yàn)證、用戶管理盐茎、權(quán)限和角色兴垦,可參閱其安全文檔。角色由一組權(quán)限組成字柠,不同的用戶角色被賦予了不同的權(quán)限滑进,Superset 本身提供了一組基本角色:
- Admin:擁有所有可能的權(quán)限,包括從其他用戶授予或撤消權(quán)限以及更改其他人的切片和 dashboard募谎。
- Alpha:可以訪問所有數(shù)據(jù)源,但不能授予或撤消其他用戶的訪問權(quán)限阴汇。它們也僅限于改變它們擁有的對(duì)象数冬。可以添加和更改數(shù)據(jù)源。
- Gamma:訪問受限拐纱,只能使用通過另一個(gè)互補(bǔ)角色獲得訪問權(quán)限的數(shù)據(jù)源铜异。他們只能查看由他們有權(quán)訪問的數(shù)據(jù)源制作的切片和 dashboard。無(wú)法更改或添加數(shù)據(jù)源秸架,但可以可以創(chuàng)建切片和 dashboard揍庄。
- sql_lab:被授予對(duì) SQL Lab 的訪問權(quán)限。
-
public:可以通過在 superset\config.py 設(shè)置
PUBLIC_ROLE_LIKE_GAMMA = True
东抹,授予該角色與 Gamma 角色相同的權(quán)限集蚂子。
在執(zhí)行
superset init
命令時(shí),所有這些基本角色將重新同步到初始值缭黔,因此不建議通過授予或撤消權(quán)限來更改這些基本角色食茎。
??這里不對(duì) Superset 的安全機(jī)制做過多展開,如果想了解更多馏谨,包括如何為用戶提供對(duì)特定數(shù)據(jù)集的訪問權(quán)限别渔,以及如何定制自己的角色,可以參閱官方的安全文檔惧互。
8 小結(jié)
??雖然 Superset 仍有著很多不足哎媚,例如:沒有提供圖表的下鉆功能、不支持多圖表間的復(fù)雜聯(lián)動(dòng)喊儡、處理大數(shù)據(jù)集效率較低拨与、權(quán)限管理和圖表管理的功能設(shè)計(jì)不友好等。但其作為一款輕量級(jí)的 BI 應(yīng)用管宵,對(duì)于個(gè)人開發(fā)者和中小型團(tuán)隊(duì)截珍,其不失為一個(gè)優(yōu)雅且高效的自助式數(shù)據(jù)分析解決方案。
Superset 的不足箩朴,一方面可以看后續(xù) Airbnb 會(huì)不會(huì)優(yōu)化岗喉,另一方面可以對(duì)其進(jìn)行二次開發(fā)。實(shí)際上炸庞,Superset 應(yīng)主要提供基于最終結(jié)果表的數(shù)據(jù)查詢和報(bào)表展示钱床,對(duì)于復(fù)雜的數(shù)據(jù)聯(lián)動(dòng),則放在 ETL 的過程中完成埠居。