上億級的大數據量,如何高性能實現展示分析?

日常一提數據分析和可視化,就想到這個工具操作要多簡單易用,圖表要多美多炫,然而總是忽略背後的數據支撐。

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』作為分佈式內存存儲框架,內存存儲有數據安全性的擔心,所以持久化層存儲用了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發瘋修整,有離線數據在,也不擔心業務部門來嚷嚷了。而且速度超快,體驗很棒~

最後

如果你也在尋求一個高性能展示分析、數據分析的BI工具的話,不妨嘗試下FineBI。


分享到:


相關文章: