系統(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)用程序”,其通過(guò)創(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。
- 通過(guò) NVD3/D3 預(yù)定義了多種可視化圖表,滿足大部分的數(shù)據(jù)展示功能。如果還有其他需求,也可以自開發(fā)更多的圖表類型,或者嵌入其他的 JavaScript 圖表庫(kù)(如 HighCharts、ECharts)。
- 提供細(xì)粒度安全模型,可以在功能層面和數(shù)據(jù)層面進(jìn)行訪問(wè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è)依賴包沒(méi)有被正確的安裝,當(dāng)時(shí)隨手就解決了,沒(méi)有記錄下來(lái)。只大概記得報(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 文件所在的路徑通過(guò) pip install 安裝即可。如果在安裝過(guò)程中遇到其他問(wèn)題,就把報(bào)錯(cuò)信息復(fù)制出來(lái),然后去問(wèn)問(wèn)神奇的 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è)問(wèn)題,可以直接通過(guò) 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 問(wèn)題
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ù)源
??接下來(lái),將演示如何連接數(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ù),接下來(lái)需要向 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)行分組或過(guò)濾):

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 以及字段過(guò)濾等設(shè)置:

??在頁(yè)面左側(cè)完成相關(guān)設(shè)置后,點(diǎn)擊 Run Query 按鈕,即可在右側(cè)的可視化視圖,查看數(shù)據(jù)的可視化展示:

5.2 創(chuàng)建圖表
??通過(guò)更改可視化類型和其他設(shè)置,可以很靈活地對(duì)數(shù)據(jù)進(jìn)行探索性分析。若在探索的過(guò)程中發(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 和分割線等組件:

??并可通過(guò)拖拽編輯 dashboard 的布局(在拖拽過(guò)程中,Superset 還提供了輔助線和柵格進(jìn)行提示):

??Superset 還可以通過(guò)編輯 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)程殺掉,注釋后沒(méi)大影響)。
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:可以訪問(wèn)所有數(shù)據(jù)源,但不能授予或撤消其他用戶的訪問(wèn)權(quán)限。它們也僅限于改變它們擁有的對(duì)象??梢蕴砑雍透臄?shù)據(jù)源。
- Gamma:訪問(wèn)受限,只能使用通過(guò)另一個(gè)互補(bǔ)角色獲得訪問(wèn)權(quán)限的數(shù)據(jù)源。他們只能查看由他們有權(quán)訪問(wèn)的數(shù)據(jù)源制作的切片和 dashboard。無(wú)法更改或添加數(shù)據(jù)源,但可以可以創(chuàng)建切片和 dashboard。
- sql_lab:被授予對(duì) SQL Lab 的訪問(wèn)權(quán)限。
-
public:可以通過(guò)在 superset\config.py 設(shè)置
PUBLIC_ROLE_LIKE_GAMMA = True,授予該角色與 Gamma 角色相同的權(quán)限集。
在執(zhí)行
superset init命令時(shí),所有這些基本角色將重新同步到初始值,因此不建議通過(guò)授予或撤消權(quán)限來(lái)更改這些基本角色。
??這里不對(duì) Superset 的安全機(jī)制做過(guò)多展開,如果想了解更多,包括如何為用戶提供對(duì)特定數(shù)據(jù)集的訪問(wèn)權(quán)限,以及如何定制自己的角色,可以參閱官方的安全文檔。
8 小結(jié)
??雖然 Superset 仍有著很多不足,例如:沒(méi)有提供圖表的下鉆功能、不支持多圖表間的復(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 的過(guò)程中完成。