superset+uwsgi+nginx(python3.5,centos7)安裝及部署(超詳細版)

一直以來都是看別人的文章懊渡、博客和主頁刽射,自己很少寫東西。一是水平有限剃执,怕寫錯了鬧笑話誓禁;二是覺得自己想寫的網(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邦危,歡迎一起討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洋侨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倦蚪,更是在濱河造成了極大的恐慌希坚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陵且,死亡現(xiàn)場離奇詭異裁僧,居然都是意外死亡,警方通過查閱死者的電腦和手機慕购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門聊疲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沪悲,你說我怎么就攤上這事获洲。” “怎么了殿如?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵昌妹,是天一觀的道長。 經(jīng)常有香客問我握截,道長,這世上最難降的妖魔是什么烂叔? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任谨胞,我火速辦了婚禮,結(jié)果婚禮上蒜鸡,老公的妹妹穿的比我還像新娘胯努。我一直安慰自己牢裳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布叶沛。 她就那樣靜靜地躺著蒲讯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灰署。 梳的紋絲不亂的頭發(fā)上判帮,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音溉箕,去河邊找鬼晦墙。 笑死,一個胖子當(dāng)著我的面吹牛肴茄,可吹牛的內(nèi)容都是我干的晌畅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼寡痰,長吁一口氣:“原來是場噩夢啊……” “哼抗楔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拦坠,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤连躏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贪婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體反粥,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年疲迂,在試婚紗的時候發(fā)現(xiàn)自己被綠了才顿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡尤蒿,死狀恐怖郑气,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腰池,我是刑警寧澤尾组,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站示弓,受9級特大地震影響讳侨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奏属,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一跨跨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦勇婴、人聲如沸忱嘹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘悦。三九已至,卻和暖如春橱脸,著一層夾襖步出監(jiān)牢的瞬間础米,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工慰技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椭盏,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓吻商,卻偏偏與公主長得像掏颊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艾帐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353