前言
為了刺激自己學習和使用superset的欲望,可以點擊這里,先看下github上的效果圖,同時,個人感覺SQL Lab也是一個特別贊的功能。
關於superset
- 官網:
http://airbnb.io/projects/superset/ - 文檔:
http://airbnb.io/superset/ - 主要功能:
- 快速創建可交互的、直觀形象的數據集合
- 有豐富的可視化方法來分析數據,且具有靈活的擴展能力
- 具有可擴展的、高粒度的安全模型,可以用復雜規則來控制訪問權限。目前支持主要的認證提供商:DB、OpenID、LDAP、OAuth、和Flask AppBuiler的REMOTE_USER
- 使用簡單的語法,就可以控制數據在UI中的展現方式
- 與Druid深度結合,可快速的分析大數據
- 配置緩存來快速加載儀表盤
下面從安裝開始介紹superset。
安裝Python
需要注意的是:superset是在Python2.7和Python3.4下測試的,Airbnb生產環境使用的Python版本是2.7.x,並且Airbnb不打算支持Python2.6。
Python的安裝步驟,在這里就不做說明了,因為Centos7自帶的Python已經是2.7.x版本了,所以無需額外安裝。可以通過python -V
查看Python的版本。
本文是在以下環境下測試的:
- 操作系統:CentOS Linux release 7.3.1611 (Core)
- Python:2.7.5
- numpy:1.7.0
- pandas:1.19.2
- superset:0.18.2
安裝setuptools
curl https://bootstrap.pypa.io/ez_setup.py | sudo python -
安裝完成之后,驗證一下:
[vagrant@hadoop-slave-1 ~]$ easy_install --version setuptools 33.1.1 from /usr/lib/python2.7/site-packages/setuptools-33.1.1-py2.7.egg (Python 2.7)
安裝依賴的軟件包
sudo yum install -y gcc-c++ python-devel libffi libffi-devel openssl openssl-devel cyrus-sasl-lib cyrus-sasl-devel cyrus-sasl gettext
安裝flask
sudo easy_install flask
安裝numpy 1.7.0
下載:
curl -o numpy-1.7.0.tar.gz https://pypi.python.org/packages/e7/b8/0eec6203c783047760db02f86791814c860397a7c79c444ddabc8a2f1c69/numpy-1.7.0.tar.gz#md5=4fa54e40b6a243416f0248123b6ec332
解壓:
tar zxf numpy-1.7.0.tar.gz
安裝:
cd numpy-1.7.0/ sudo python setup.py install
安裝pandas 0.19.2
下載:
curl -o pandas-0.19.2.tar.gz https://pypi.python.org/packages/08/9d/31ec596099f14528fc6ad39428248ac5360f0bb5205a3ee79a5d1cf260fb/pandas-0.19.2.tar.gz#md5=26df3ef7cd5686fa284321f4f48b38cd
解壓:
tar zxf pandas-0.19.2.tar.gz
安裝:
cd pandas-0.19.2/ sudo python setup.py install
安裝superset 0.18.2
下載
curl -o superset-0.18.2.tar.gz https://pypi.python.org/packages/56/53/83d8e2d6cd2c36d0318f82b7f611a07e534e7fb0afe3dd5424a57f114082/superset-0.18.2.tar.gz#md5=27ea370cc453a1937e9209778fc15ab0
解壓:
tar zxf superset-0.18.2.tar.gz
安裝:
cd superset-0.18.2/ sudo python setup.py install
至此,superset就安裝完畢了,下面開始superset的入門教程。
superset入門教程
1,創建管理員賬戶
fabmanager create-admin --app superset
在輸入用戶名,姓名,郵箱,密碼之后,fabmanager會在用戶的主目錄下創建.superset
隱藏目錄,並在該目錄下創建一個sqlite3數據庫。執行下面的命令可以看到上一步創建的用戶被保存到了ab_user表中:
2,初始化數據庫
superset db upgrade
3,加載一些測試數據
superset load_examples
4,創建默認的角色和權限
superset init
5,啟動web服務器
superset runserver
web服務器的默認端口是8088,可以通過-p
選項綁定其他的端口;也可以通過-d
選項啟動一個用於開發的服務器。
需要注意的是:
superset默認的應用服務器是gunicorn,但是gunicorn是無法在windows上工作的,所以在windows上只能使用用於開發的服務器。
啟動web服務器之后,就可以使用瀏覽器訪問superset了。
配置superset
可以通過創建一個叫做superset_config.py
的模塊,並將它放到PYTHONPATH下的方式,配置superset。下面是一個示例:
#--------------------------------------------------------- # Superset specific config #--------------------------------------------------------- ROW_LIMIT = 5000 SUPERSET_WORKERS = 4 SUPERSET_WEBSERVER_PORT = 8088 #--------------------------------------------------------- #--------------------------------------------------------- # Flask App Builder configuration #--------------------------------------------------------- # Your App secret key SECRET_KEY = '\2\1thisismyscretkey\1\2\e\y\y\h' # The SQLAlchemy connection string to your database backend # This connection defines the path to the database that stores your # superset metadata (slices, connections, tables, dashboards, ...). # Note that the connection information to connect to the datasources # you want to explore are managed directly in the web UI SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/superset.db' # Flask-WTF flag for CSRF CSRF_ENABLED = True # Set this API key to enable Mapbox visualizations MAPBOX_API_KEY = ''
在這個配置模塊中,也可以定義被Flask App Builder(superset所使用的web框架)使用的參數,關於這部分配置,請查看這里。
其中有兩個需要改變的參數:
SQLALCHEMY_DATABASE_URI
它的默認值是~/.superset/superset.db
,該參數用來指定 保存superset元數據(比如slices、connections、tables、dashboards等)的數據庫 的Sqlalchemy連接字符串(要搜索的數據源的連接信息是由web UI直接管理的)SECRET_KEY
它是一個很長的隨機字符串
數據庫依賴
默認情況下,superset是把元數據保存到sqlite中的,所以除了sqlite之外,superset不依賴任何數據庫。如果想要把superset元數據保存到其它的數據中,那么需要安裝相應的驅動以及給SQLALCHEMY_DATABASE_URI
參數指定一個正確的值。下面是一些推薦使用的數據庫、數據庫驅動以及對應的SQLAlchemy URI前綴:
緩存
superset使用Flask-Cache來緩存數據。在superset_config.py
中,可以通過CACHE_CONFIG
參數配置緩存所使用的后端。
Flask-Cache支持多種緩存后端,比如Redis、Memcached、SimpleCache(in-memory)、local filesystem。以redis為例,首先應該安裝Python的redis驅動:
sudo easy_install redis
然后在superset_config.py
中增加如下的配置:
CACHE_CONFIG = { "CACHE_TYPE": "redis", "CACHE_REDIS_URL": "redis://[redis:<密碼>]@<redis_host>:<redis_port>/", "CACHE_KEY_PREFIX": "A CACHE_KEY_PREFIX" }
與SQLAlchemy的深度集成
在superset中可以通過SQLAchemy暴漏的參數調整數據庫連接信息,在Database
編輯頁面,可以看到一個Extra
域(值是一個Json串):
在這個Json串中可以包含額外的配置選項。其中engine_params
所指定的參數會傳遞給sqlalchemy.create_engine調用;metadata_params
所指定的參數會傳遞給sqlalchemy.MetaData調用。更多詳細信息,可以閱讀SQLAlchemy的文檔。
中間件
superset允許自定義中間件,方法是:
- 編寫自己的WSGI中間件
- 在
superset_config.py
中增加ADDITIONAL_MIDDLEWARE
參數,該參數的值是一個 中間件類 的列表
比如:
# superset_config.py # other configuration... class TestMiddleware(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): print("test middleware") return self.app(environ, start_response) ADDITIONAL_MIDDLEWARE = [TestMiddleware]
升級superset
sudo easy_install --upgrade superset superset db upgrade superset init
SQL Lab
SQL Lab是一個非常強大的SQL IDE,它可以和所有與SQLAlchemy兼容的數據庫一起使用。默認情況下,查詢是在web請求的作用域中執行的,因此當web請求超時的時候,查詢也會超時。
為了支持運行時間超過web請求的超時時間的查詢,superset支持異步查詢,配置異步查詢的方式如下:
- 在創建數據源的時候,勾選
Allow Run Async
域
- 在
superset_config.py
模塊中,通過CELERY_CONFIG
配置celery的broker和result backend,注意:worker和web服務進程應該使用相同的配置 - 通過
superset worker
命令,啟動一個或多個superset worker(本質上就是celery worker) - 為了設置result backend,應該在
superset_config.py
配置模塊中給RESULTS_BACKEND
鍵指定為werkzeug.contrib.cache.BaseCache
的一個派生類實例。可以使用自帶的Redis、Memcache、S3、內存、文件系統cache實現,也可以自己編寫cache實現
# superset_config.py # other configurations ... class CeleryConfig(object): BROKER_URL = 'redis://localhost:6379/0' CELERY_IMPORTS = ('superset.sql_lab', ) CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_CONFIG = CeleryConfig from werkzeug.contrib.cache import RedisCache RESULTS_BACKEND = RedisCache( host='192.168.30.2', port=6379, db=3, key_prefix="superset_results:") ``` SQL Lab在查詢的時候,也支持Jinja模版,可以通過superset配置文件中的`JINJA_CONTEXT_ADDONS`參數配置默認的Jinja上下文。比如: ``` JINJA_CONTEXT_ADDONS = { 'my_crazy_macro': lambda x: x*2, }
連接到新的數據庫
登陸之后點擊:
然后點擊“+”,進入到Database view頁面:
在database view頁面,填寫數據庫的名字以及SQLAlchemy連接字符串,想要了解更多關於SQLAlchemy連接字符串,請點擊這個鏈接:
然后點擊“Test Connection”,如果運行superset服務的實例能夠連接到數據庫,會彈出類似下面的提示信息:
同時要注意以下幾項:
- 執行“Test Connection”之后,在頁面的底部會列出該數據庫中都有哪些表
- 如果想要在SQL Lab中顯示這個數據庫,那么應該勾選:Expose In SQL Lab
保存之后,在SQL Lab中就可以看到這個數據庫了:
- 如果允許用戶異步地執行SQL查詢,那么應該勾選“Allow Run Async”
最后點擊“Save”按鈕,這個數據庫就建立完成了。
添加一個新的表
首先,在上一步添加的數據庫中,創建一張新表:
CREATE TABLE `grade_test` ( `course_id` int(10) unsigned NOT NULL, `student_id` int(10) unsigned NOT NULL, `grade` int(10) unsigned NOT NULL DEFAULT '0', `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `course_name` varchar(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后,插入一些測試數據:
insert into grade_test(course_id, student_id, grade, course_name) values(1,1,80,"english"),(1,2,85,"english"),(2,1,90,"math"),(2,2,70,"math"),(1,3,99,"english"),(2,3,88,"math");
接下來開始添加新的表:
保存之后,重定向到的頁面頂部會有一條提示信息:
然后進入到“Table Model View”頁面,點擊新添加的表的表名前面的“Edit record”:
在結果頁面上,點擊“List Table Column”標簽:
接下來,就可以定義對表中指定的列的使用方式了:
- 如果想要使用某個列進行分組,那么將該列標記為Groupable
- 如果想要使用某個列進行過濾,那么將該列標記為Filterable
- 如果想要在某列上進行count distinct,那么將該列標記為Count Distinct
- 如果想要對某列進行求和,或者進行簡單的統計,那么將該列標記為Sum、Min、Max
- 任何時間或日期類型的列,都應該被標記為temporal
搜索數據
首先,進入到“Table Model View”:
然后點擊表名:
默認情況下,展現的是Table View,並且默認的查詢是獲取表中的所有的記錄數:
接下來看“Time”區:
- Time Column:用來指定一個temporal類型的列
- Time Grain:用來指定時間的粒度
- Since過濾器:用來指定時間的下限(含)
- Util過濾器:用來指定時間的上限(含)
“Time”區的下面是“Group By”區:
- Group By:用來指定按照那些列進行分組
- Metrics:用來指定對哪些列進行何種統計(比如對某列求平均值)
比如,想要求每個學生的平均成績和成績總和:
然后點擊,左上角的Query,就可以在右側看到結果了:
下面看一些其它有趣的功能:
- Filters:
點擊頁面右上角的Query按鈕:
Filters其實是以AND的方式加到where語句的條件中了
- Options:
- Row Limit:為SQL的limit子句指定一個值
- Page Length:指定每頁多少條記錄
Superset支持很多表格類型,具體可以看官網提供的“畫廊”。
創建slice和dashboard
一個被保存的查詢叫做slice。點解Query按鈕右側的Save as按鈕就可以創建一個slice:
點擊Save as,在Save as窗口填寫slice的名字,同時也可以將slice添加到一個新創建的dashboard中,或已經已經存在的dashboard中,當然也可以不添加到任何dashboard中(所以說,一個dashboard可以一起展示0個或多個slice):
接下來,我們就可以在slice和dashboard中分別看到剛才新建的slice和dashboard:
進入到剛才新建的dashboard,可以通過拖拽表格的右下角,放大和縮小表格:
還可以通過右上角的 Move Chart來移動表格:
修改dashboard之后,需要點擊保存按鈕進行保存:
畫出更漂亮的表格
在 superset入門教程 小節中,已經介紹過,可以通過superset load_examples
命令導入一些測試數據,其中包含若干slice和dashboard,因此可以通過研究這些slice,來學習畫出比Table View更“漂亮”的表格。
遇到的問題
- superset 0.18.2依賴pandas 0.19.2,pandas依賴numpy,但是當numpy版本高於1.7.0的時候,運行superset會報錯,所以本文是先安裝numpy 1.7.0,然后安裝的pandas 0.19.2 和 superset 0.18.2,這點可能和其他的教程有所不同。
待解決的事項
- 用戶的權限控制
- 與Apache kylin集成