案例 | 上億級的數據量,如何高性能實現展示分析?
14 人贊了文章
日常一提數據分析和可視化,就想到這個工具操作要多簡單易用,圖表要多美多炫,然而總是忽略背後的數據支撐。
excel 幾十萬行數據就卡死崩,談何數據透視表、可 視化?
近千萬行的數據,訂單提交資料庫,sql sever處理要5分多鐘,如果頻繁入庫/取數的話.....
要知道,為了支撐起業務人員的數據分析,以及日常不考慮計算邏輯和技術難度,IT人員也是要花費很大的心血和精力啊(心疼運維人員n秒)。
隨著公司業務的發展,數據量變大是必然的事實。那麼,數據部門要做分析,業務部門要看報表,要跑數據,要用BI,大數據量(千萬級及以上)的分析,性能該如何優化?
這裡借某公司的真實案例,來闡述一下方案。
----------------------------------
作為公司的科技部門人員,經常聽到業務部門對自己使用的資料庫各種吐槽:
竟然存放在mongoDB中啊,震驚(ΩДΩ)。
資料庫慢慢熟悉了還好啊,但是現在每天的數據量越來越大,而且還在增加啊,增加大家很開心,然而資料庫並不開心啊,簡單的查詢統計10多分鐘還出不來結果,更不用說有稍微複雜點的統計分析了。
我天天找DBA優化啊,然而並沒有什麼水花。
數據量還在不斷增長,到現在都上億啦,全量查詢統計根本出不來結果啊。
... ...
最終業務人員找到科技部門提需求要弄個BI系統給處理下。
對mongodb瞄了一大通,這就是個業務庫。那直接對接mongodb自然不行,速度慢不說,mongodb掛了,分析系統也癱了。自然就想到了使用中間庫,emm mysql oracle 倒是有,可以跑調度抽過來,但是速度依舊不快呢,還要花功夫優化,性價比不高。公司有自己的hadoop平台,將數據抽過來再對接倒是可以,但是要花很大精力跑調度,而且這個資料庫不能隨意給這個業務部門提供,萬一玩掛了可就得不償失。假設有個具備離線數據存儲功能的BI工具,豈不美哉。
於是將市面上有離線數據存儲功能的BI工具翻了個遍。期望找到個性能好,可以支持大數據量數據分析的BI工具。
Tableau的hyper功能看起來OK,經不起實際使用,數據量過了億,等了好久數據抽不好,pass;
其他某BI工具有mpp離線存儲,看起來很棒,還能橫向擴展,不錯。抱有最大期望的用,結果數據量一上億,直接崩了,崩了,pass;
另一個BI工具去看了看,咦,數據是放在vertica裡面的......
後來,找到了FineBI的分散式計算引擎方案,拿的『定製的 Alluxio』作為分散式內存存儲框架(個人有興趣可以去翻翻https://www.alluxio.org/),內存存儲有數據安全性的擔心,所以持久化層存儲用了HDFS。為了數據分析嘛,自然是列式存儲的。計算核心則以熟知的Spark,加上自研演算法來處理的。使用熟知的zookeeper整合框架,並用於調度通信。
分散式嘛,橫向擴展自然不在話下。而列式存儲、並行內存計算、計算本地化加上高性能演算法,在FineBI中數據展示速度超快。有意思的是其計算本地化的操作,能減少不必要的shuffle,節省數據傳輸的消耗,提升數據計算速度。
以下記錄利用FineBI4.1工具的系統建設過程。
一、需求分析
針對以上的需求,可以預估到,18年內,常用分析預計最大數據量會達到4.7kw,不常用分析會達到3億到4億(包含淡季),數據總的體量最多會達到100G。後面的情況難以預估,就需要系統可橫向擴展節點。
二、方案描述
1.系統架構
根據官方推薦,將FineBI的web應用端與數據存儲的分散式引擎放在一個機器上(處於安全考慮,也可以分開。這裡不涉及太多部門使用,放一起即可),架構如下所示。
架構圖難以理解的話,可以看看靈魂畫手的傑作~
結合分散式引擎說明的技術原理,將各個機器再細分化各個組件的作用。
以上,將系統架構規劃完成,即可具體完成系統。
2.完成從MongoDB取數
在使用BI工具對接MongoDB的時候,使用MongoDB的BI連接器。
感興趣可以看:MongoDB Download Center
方案原理:mongodb是非結構的資料庫,而要想BI來連接,通過建模的方式取表,拆表,建模來分析。通過MONGODB CONNECTOR FOR BI連接器的方式,使用mysql的JDBC驅動來獲取數據。
實現過程:
第一步:安裝MONGODB CONNECTOR FOR BI
從官網選擇版本:MongoDB Download Center
第二步:生成DRDL文件
mongodrdl是生成該文件的主命令。通過添加monogdb的相關參數來獲取其中的表生成drdl文件。從官方文檔上我們可以找到生成DRDL文件命令的範式:
1 mongodrdl --host myhost.example.net:27017 2 --username dbUser 3 --password myPassword 4 --db reports 5 --authenticationDatabase admin 6 --out schema.drdl
範式說明:
- --host 是mongodb的ip+埠號,通常可為127.0.0.1:27017
- --username 是mongodb的用戶,需具備相關的數據許可權
- --password 是username的密碼
- --db 是要生成DRDL的資料庫實例名
- --authenticationDatabase 是指定創建用戶的資料庫。即username創建時被指定到的資料庫名。
- --out 是DRDL輸出文件定義。值使用.drdl的文件即可。
第三步:啟動連接器,連接上monogdb
啟動連接器的主命令服務是mongosqld,由於mongodb開啟用戶認證了(auth=true)。從官方文檔上可知,連接器的啟動需要使用-auth參數,再使用auth參數的情況下,mysql驅動來取數就需要SSLl加密認證。
所以第一步需要配置mongosqld的SSL認證;才能啟動連接器來取數!!!!!!!!!!這一步神坑,也是踩了多少坑,才找到的解決辦法。
此處認證關係是FineBi端的mysql連接與mongosqld的連接之間的SSL認證。在認證時,只需要配置單向SSL的認證即可(mongosqld認證FineBI的連接)。
(1)生成SSL認證文件
SSL認證文件通常採用openSSL來生成,先看看是否安裝了openSSL;執行命令:
rpm -qa|grep -i openssl
如安裝了會返回信息,未安裝需要自行安裝OpenSSL。
採用以下命令來生成證書:(由於是測試,就直接自己生成證書,密鑰)
openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
命令返回會讓填寫一些值,在後面填寫即可。
一般情況下,文件會生成到你所使用的linux用戶的要根目錄下:比如我用的root用戶,就到/root下面查找。
再使用以下命令,將key合到.pem的文件里。
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
將該文件移動/etc/ssl下面用於驗證使用:
mv mongodb.pem /etc/ssl
(2)啟動連接器&SSL
再來看官方文檔,從所有的參數命令裡面,找一找需要的參數;得出以下的範式,在bin目錄下啟動即可。
mongosqld --auth --sslMode --sslPEMKeyFile --sslAllowInvalidCertificates --defaultAuthSource --mongo-uri --mongo-username --mongo-password --mongo-authenticationSource --schema
說明:
- --auth 是開啟用戶認證的參數,默認值是true
- --sslMode是開啟SSL的標識,如開啟可以選擇值為「requireSSL」
- --sslPEMKeyFile是SSL認證文件,一般為.pem結尾的文件;單向認證的時候。
- --sslAllowInvalidCertificates
- --defaultAuthSource是mongosqld使用username指向mongodb的有許可權的庫,默認值是admin
- --mongo-uri是mongodb的host,一般為ip+埠號
- --mongo-usrname是drdl生成的用戶名
- --mongo-password是drdl生成的密碼
- --mongo-authenticationSource指定用戶的創建庫
- --schema是要連接的drdl文件。
註:一般還是要用nohup 的命令來生成,保證shell斷掉,連接器依然可用。
第四步:啟動FineBI連接到連接器上
啟動FineBI,打開FineBI>數據配置>數據連接:添加數據連接選擇mysql,配置如下:
- 連接名:mongodb
- URL:jdbc:mysql://127.0.0.1:3307/test?ssl-key=/etc/ssl/mongodb.pem
- 用戶名:
- 密碼:
註:URL:jdbc:mysql://ip+3307/dbname?ssl-key=xx.pem,後面ssl-key是ssl參數
點擊測試連接即可。
過程坑點:mongodb的BI連接器神坑,官網文檔不多,踩過了幾腳坑。
(1)mongosqld按ssl認證開啟成功,列印也不錯,但是BI連接的時候,還是拋錯1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR):this server only allows SSL xxxxx該拋錯是mysql拋出來的,握手不良的錯誤。按道理SSL已經開啟了,不應該是這樣。後來查了mysql的文檔,mysql5.5以上的版本才支持SSL;更換新的driver驅動,使用的是5.1.44完全沒問題的。
(2)BI連接的時候拋錯 handshake error: ERROR 1043 (08S01): error performing authentication: unable to authenticate conversation 0: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.
該拋錯的意思,使用「SCRAM-SHA-1」的認證方式,沒有認證成功。SCRAM-SHA-1是指用戶名密碼的方式,這裡看是不是用戶名/密碼錯誤,注意mongosqld啟動時的使用的用戶名/密碼
(3)一定要開啟SSL認證啊!!!
(4)期間有設計器無故死掉的情況,發現是由於內存不足導致。記得空閑內存要足夠!!
三.系統效果
1.數據更新
(1) 單個表先全量抽取,之後每天對單表依據時間戳,做增量增加。其中有錯誤數據做增量刪除即可。
(2)有些內部使用的實時性較高的表,設定每2小時更新一次,從上午9點到下午6點。直接從業務庫抽取其實是有風險的,當時資料庫壓力大,抽取比較慢,因此這部分僅作為非重點用戶需求場景。
2.數據展示速度
做了一個簡單的依據時間的group by,時間在1s之內,翻頁速度也很快。
至此,對接mongodb完成,一個用戶可以隨便玩的系統就好了。即使偶爾mongodb發瘋修整,有離線數據在,也不擔心業務部門來嚷嚷了。而且速度超快,體驗很棒~
官網地址:FineBI
演示地址:demo幫助學習文檔:FineBI幫助文檔
推薦閱讀:
※MySQL基礎練習2
※《專利審查指南修改草案》將圖形用戶界面(GUI)納入外觀設計專利範圍內,這改變意味著什麼?
※【翻譯】《利用Python進行數據分析·第2版》第4章(中)NumPy基礎:數組和矢量計算
※玩轉Pandas,讓數據處理更easy系列2
※基於Python的信用評分卡模型分析