一直以來都是看別人的文章懊渡、博客和主頁刽射,自己很少寫東西。一是水平有限剃执,怕寫錯了鬧笑話誓禁;二是覺得自己想寫的網(wǎng)上基本都有了,自己再寫也是徒勞肾档。
之所以今天有這么大的動力寫這篇文章摹恰,是因為自己在網(wǎng)上搜了好久,沒有說的特別詳細的怒见;二是總是抄別人的俗慈,自己不貢獻點東西,有一種愧疚感遣耍。希望和我一樣初學(xué)superset的工作者闺阱,不用再像我當(dāng)初一樣挖坑、填坑舵变。酣溃。。循環(huán)(險些神經(jīng)衰弱纪隙。赊豌。。绵咱。)
廢話不多說碘饼,進入主題:
系統(tǒng)基本要求:最好是較完整版的centos7,支持yum install安裝命令
下面都是些安裝流程悲伶,代碼居多艾恼,字會比較少:
安裝python3(因為想寫成詳細版,就把一些基礎(chǔ)的環(huán)境安裝也加了進來拢切,可適自己的情況選擇跳過):
python3依賴包安裝
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
# 本文以/home/software作為主目錄蒂萎,所有軟件都安裝于此
mkdir -p /home/software
cd /home/software
wget https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz
tar -xf Python-3.5.3.tar.xz
mv Python-3.5.3 python3.5.3
cd python3.5.3
./configure prefix=/home/software/python3
make
make install
配置python3和pip3:
ln -s /home/software/python3/bin/python3 /usr/bin/python3
ln -s /home/software/python3/bin/pip3 /usr/bin/pip3
設(shè)置后執(zhí)行下python3,然后再執(zhí)行下pip3淮椰,如果有反應(yīng)說明配置成功
安裝superset:
yum install cyrus-sasl-lib.x86_64 cyrus-sasl-devel.x86_64 libgsasl-devel.x86_64
yum install build-essential libssl-dev libffi-dev python-dev python-pip libsasl2-dev libldap2-dev
pip3 install superset
安裝好之后superset項目會出現(xiàn)在/home/software/lirui/python3/lib/python3.5/site-packages/superset文件夾下
配置superset:
vi ~/.bashrc
加入:alias superset='/home/software/python3/lib/python3.5/site-packages/superset/bin/superset'
# 保存并退出
source ~/.bashrc
此時五慈,執(zhí)行supeset會出現(xiàn)一些命令提示
安裝superset一些依賴模塊:
pip3 install flask_compress
pip3 install unicodecsv
pip3 install geopy
配置fabmanager環(huán)境變量:
ln -s /home/software/python3/bin/fabmanager /usr/bin/fabmanager
初始化superset管理員賬戶:
fabmanager create-admin --app superset
# 按照命令提示依次輸入想要設(shè)置的用戶信息纳寂,我是依次輸入的admin,admin,admin,admin,1111@qq.com,123,123
初始化superset賬戶
superset db upgrade
superset load_examples
superset init
安裝nodejs(make && make install步驟耗時較長,將近半小時泻拦,可以干點別的或四處走走):
資源包下載:wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x64.tar.xz
xz -d node-v8.10.0-linux-x64.tar.xz
tar -xvf node-v8.10.0-linux-x64.tar
# 二進制安裝文件下載:
wget https://nodejs.org/dist/v8.10.0/node-v8.10.0.tar.gz
tar -zxvf node-v8.10.0.tar.gz
cd node-v8.10.0
# 編譯和安裝
./configure --prefix=/home/software/nodejs
make && make install
nodejs主要是利用里面的一些模塊處理前端的一些代碼毙芜,比如webpack模塊,用于代碼打包
# 配置node和npm路徑:
vi /etc/profile
# 加入以下內(nèi)容:
export NODE_HOME=/home/software/nodejs
PATH變量后面追加(注意要包含冒號) :$NODE_HOME/bin
保存并退出
source /etc/profile
退出后可以執(zhí)行命令node,npm
安裝cnpm争拐,更新npm和cnpm(用了淘寶的國內(nèi)鏈接腋粥,安裝和更新比較快)
npm install -g cnpm --registry=https://registry.npm.taobao.org #安裝cnpm
cnpm install npm -g # cnpm更新npm
cnpm install -g n # cnpm自更新
安裝uwsgi(自己實際安裝的時候發(fā)現(xiàn),pip3 install uwsgi有時會安裝到python2的環(huán)境上去架曹,經(jīng)大神指教隘冲,改成如下):
python3 -m pip install uwsgi
安裝nginx:
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
mv nginx-1.10.3 nginx
cd nginx
./configure --prefix=/home/software/nginx --with-http_stub_status_module --with-http_gzip_static_module
make
make install
配置nginx環(huán)境變量:
vi ~/.bashrc
添加:alias nginx='/home/software/nginx/sbin/nginx'
保存并退出
source ~/.bashrc
關(guān)閉防火墻:
systemctl stop firewalld.service
systemctl disable firewalld.service
運行:
cd /home/software/python3/lib/python3.5/site-packages/superset/static/assets
cnpm install -d //生成依賴包目錄node_modules,下載依賴
cnpm run dev //監(jiān)聽頁面變動并自動打包(生產(chǎn)環(huán)境需要運行cnpm run prod,此命令執(zhí)行耗時大概10小時左右绑雄,非上線請勿執(zhí)行)
執(zhí)行完以上命令展辞,會把打包后的文件放到/home/software/python3/lib/python3.5/site-packages/superset/static/assets/dist文件夾下
然后,在/home/software/python3/lib/python3.5/site-packages/superset中創(chuàng)建run.py万牺,此文件為uwsgi的文件入口罗珍,項目的內(nèi)容通過此文件與uwsgi交互
vi run.py
加入以下代碼:
from superset import app
if __name__ == '__main__':
app.run(host='0.0.0.0')
保存并退出
uwsgi配置
mkdir -p /home/uwsgi_conf
cd /home/uwsgi_conf
vi uwsgi.ini
加入以下內(nèi)容(里面有些配置項我也不是很懂,但一般都是這么配):
[uwsgi]
# 指定uwsgi協(xié)議入口文件
wsgi-file=/home/software/python3/lib/python3.5/site-packages/superset/run.py
# 指定入口文件中調(diào)用run方法的變量名
callable=app
# 指定sock的文件路徑
socket= /home/uwsgi_conf/uwsgi.sock
# 指定靜態(tài)文件(static-map=網(wǎng)頁地址=本地文件位置脚粟,靜態(tài)文件一般在nginx中配置)
#static-map=/static=/home/myproject/static
# 設(shè)置日志目錄
daemonize= /home/uwsgi_conf/uwsgi.log
# pid文件位置
pidfile= /home/uwsgi_conf/uwsgi.pid
# 進程個數(shù)
workers=4
# 指定IP端口(因為后期靠nginx分發(fā)覆旱,所以不需要wsgi的http接口)
http=localhost:8088
# 啟動uwsgi的用戶名和用戶組(都用root啟動,是出于權(quán)限的考慮核无,其他權(quán)限可能會啟動失斂鄢)
uid=root
gid=root
# 啟用主進程
master=true
# 自動移除unix Socket和pid文件當(dāng)服務(wù)停止的時候
vacuum=true
# 序列化接受的內(nèi)容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設(shè)置自中斷時間
harakiri=30
# 設(shè)置緩沖
post-buffering=4096
# 設(shè)置代碼改動后自動加載
py-autoreload = 1
保存并退出
執(zhí)行
uwsgi --ini /home/uwsgi_conf/uwsgi.ini
打開瀏覽器团南,訪問127.0.0.1:8088
如果正常訪問画舌,則說明配置沒有問題
nginx配置:
修改nginx配置文件
文件路徑:/home/software/nginx/conf/nginx.conf(此文件內(nèi)容較多,只改一部分)
vi /home/software/nginx/conf/nginx.conf
文件頭3行改為(root權(quán)限已慢,4個進程,報錯的日志文件路徑):
user root;
worker_processes 4;
error_log /home/uwsgi_conf/error.log;
找到server配置項霹购,原有的location項刪除掉佑惠,替換成下面這些(注意因為項目引用了2個模塊的js資源文件,所以要設(shè)置2個靜態(tài)路徑):
location / {
include uwsgi_params; # 導(dǎo)入一個Nginx模塊他是用來和uWSGI進行通訊的
uwsgi_connect_timeout 30; # 設(shè)置連接uWSGI超時時間
uwsgi_pass unix:/home/uwsgi_conf/uwsgi.sock; # 指定uwsgi的sock文件所有動態(tài)請求就會直接丟給他
root html;
index index.html index.htm;
}
location /static\/appbuilder/ {
alias /home/software/python3/lib/python3.5/site-packages/flask_appbuilder/static/;
index index.html index.htm;
}
location /static\/assets/ {
alias /home/software/python3/lib/python3.5/site-packages/superset/static/;
index index.html index.htm;
}
保存并退出
執(zhí)行
nginx -c /home/software/nginx/conf/nginx.conf
打開瀏覽器齐疙,訪問 127.0.0.1如果可以訪問膜楷,說明配置成功,如果出現(xiàn)報錯的話贞奋,去/home/uwsgi_conf/error.log中找問題
順便提一句赌厅,關(guān)閉所有uwsgi和nginx進程的命令:
ps -aux|grep -E 'uwsgi|nginx'|awk '{print $2}'|xargs kill -9
關(guān)閉后重啟服務(wù)可以執(zhí)行:
uwsgi --ini /home/uwsgi_conf/uwsgi.ini & nginx -c home/software/nginx/conf/nginx.conf
######################################分####割######線################################
一些配置:
所有的配置項均在 /home/software/python3/lib/python3.5/site-packages/superset/config.py下
數(shù)據(jù)庫的配置
本人用不習(xí)慣sqlite,所以將數(shù)據(jù)庫改成了mysql轿塔,改動如下:
SQLALCHEMY_DATABASE_URI = 'mysql://用戶名:密碼@mysql地址:端口(默認3306)/數(shù)據(jù)庫名稱?charset=utf8'
pymysql模塊安裝
pip3 install pymysql
安裝之后需要還要修改一下sqlalchemy的配置文件特愿,才能讓superset識別pymysql
vi /home/software/python3/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/__init__.py
在最上面加入2行:
import pymysql
pymysql.install_as_MySQLdb()
保存并退出
修改完之后記得重新執(zhí)行:
supeset db upgrade
superset load_examples
superset init
執(zhí)行完畢后仲墨,執(zhí)行,
uwsgi --ini /home/uwsgi_conf/uwsgi.ini & nginx -c home/software/nginx/conf/nginx.conf
訪問:127.0.0.1,揍障,大功告成
順便說下centos7下mysql的安裝:
yum -y install mariadb # 安裝
systemctl start mariadb # 啟動
輸入 mysql目养,進入mysql客戶端
use mysql #進入mysql配置庫
select user(); #選中當(dāng)前用戶
set password=password('123456'); # 為當(dāng)前用戶設(shè)置密碼為123456
退出之后,就需要密碼才能登陸了毒嫡,命令如下
mysql -hlocalhost -uroot -p
之后輸入自己的密碼登陸
設(shè)置遠程訪問
GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'%'IDENTIFIED BY '數(shù)據(jù)庫的密碼' WITH GRANT OPTION;
flush privileges; # 確認設(shè)置
退出后癌蚁,可遠程連接mysql
###########################分######割#######線#################################
項目構(gòu)成的簡單介紹
此框架后端以flask為主,通過flask的一些衍生模塊進行快捷的開發(fā)兜畸,如:flask_appbuilder,flask_bootstrap
路由以及和前端交互的主邏輯都在superset/views/core.py下
前端主要框架是react和redux(負責(zé)數(shù)據(jù)存儲)努释,也混合了一些jquery,最后將這些代碼打包生成了dist下面的可執(zhí)行的js文件咬摇。
打包入口文件在superset/static/assets/webpack.config.js的entry配置項中伐蒂,如果懂react的朋友和從此文件開始下手,改一些前端的效果菲嘴,當(dāng)然饿自,改完之后需要經(jīng)過編譯才能生效,測試編譯命令(需要在superset/static/assets下執(zhí)行):cnpm run dev龄坪,在測試確定頁面沒有問題的情況下昭雌,在此目錄下執(zhí)行cnpm run prod,此命令大概需要10小時健田,執(zhí)行之后就去睡覺吧烛卧,第二天就能看到結(jié)果了。
下面說幾個改過的簡單的例子:
1妓局、pivot_table列順序排列修改
列排序依賴于view/core.py文件中的explore_json方法总放,此方法返回一個json對象,json解析后的json_obj['data']['html']決定了頁面最終的列的排序好爬,json的生成依賴于根目錄下的viz.py文件的get_payload方法局雄,BaseViz.get_payload方法中的get_data方法
會生成json,注意此get_data為PivotTableViz類下的方法(非BaseViz下的)存炮,此文件生成的df順序為最終返回在json順序炬搭,在return前做出修改,加入以下代碼:
如果后綴是數(shù)據(jù)穆桂,則返回數(shù)組宫盔,否則返回當(dāng)前字符串
def tarns_to_num(str_tem):
target_str = str_tem[-1].split('_')[-1].replace('%', '')
result = float(target_str) if target_str.replace(',', '').isdigit() else target_str
return result
生成列重新排序后的df
columns_list = list(df.columns)
sort_columns_list = sorted(columns_list, key=tarns_to_num, reverse=False)
df = df.loc[:, sort_columns_list]
2、pivot_table按照多列g(shù)roupby的時候享完,排序功能會消失
此問題的df得到方式和例子1一致灼芭,都在viz.py的PivotTableViz類下的get_data方法中,通過修改最終產(chǎn)生的df般又,將多列g(shù)roupby改成單列g(shù)roupby彼绷,并把其余的列追加到columns中去巍佑;
除此之外statis/assets/visualizations/pivot_table.js文件中也對此做了限制,當(dāng)groupby列數(shù)多于1列時苛预,不在提供排序功能句狼,所以要對此文件也做出修改,綜上所述热某,改動如下:
viz.py文件的PivotTableViz類下的get_data方法腻菇,在return 方法之前加入以下代碼:
多列g(shù)roupby的index類與單列的區(qū)別在于是否是pd.core.indexes.multi.MultiIndex的子類
if isinstance(df.index, pd.core.indexes.multi.MultiIndex):
index_list = list(zip(*list(df.index)))
columns = list(df.columns)
index_names = [(columns[0][0], x) for x in list(df.index.names)]
index_names[0] = index_names[0][1]
columns = list(df.columns)
index = pd.Index(index_list[0], dtype='object', name=index_names[0])
for i in range(1, len(index_names)):
df[(index_names[i])] = index_list[i]
df.index = index
print(index_names[1:] + columns)
df = df.loc[:, index_names[1:] + columns]
statis/assets/visualizations/pivot_table.js的第42行左右:
將if (fd.groupby.length === 1) 改為 if (fd.groupby.length >= 1)
改完之后npm run dev編譯后即可。
唉昔馋,感覺廢話太多筹吐,有點跑偏了,但真心希望看到這篇文章的同學(xué)不再經(jīng)歷我的血淚史秘遏,所以有點啰嗦丘薛,希望對看到的朋友能有幫助吧,有疑問請加qq:270239148邦危,歡迎一起討論